Customer loyalty programs, points, tiers, and rewards
Import members from CSV data
Import multiple members into a loyalty program from parsed CSV data. Supports name, email, phone, initial points, and enrolled date. Creates users if they do not exist.
Permissions: 🟢 loyalty.create
path Parameters
programId^[0-9]+$ · requiredLoyalty program ID
Import members from CSV data › Request Body
Array of member objects to import
Import members from CSV data › Responses
Default Response
statusList loyalty members
Get all members of a loyalty program with pagination and search
Permissions: 🔵 loyalty.read
path Parameters
programId^[0-9]+$ · requiredLoyalty program ID
query Parameters
pagePage number
limitItems per page
sortSort field (created_at, current_balance, lifetime_earned, lifetime_redeemed, user_name, user_email, tier_name)
orderSort order
searchSearch by name, email, or phone
tierIdFilter by tier ID, or "none" for members without a tier
startDateFilter members enrolled on or after this date (ISO 8601)
endDateFilter members enrolled on or before this date (ISO 8601)
minBalanceMinimum current balance
maxBalanceMaximum current balance
minLifetimeEarnedMinimum lifetime earned points
maxLifetimeEarnedMaximum lifetime earned points
minLifetimeRedeemedMinimum lifetime redeemed points
maxLifetimeRedeemedMaximum lifetime redeemed points
List loyalty members › Responses
Default Response
statusGet member details
Get detailed member information including account, user info, tier, and program details
Permissions: 🔵 loyalty.read
path Parameters
programId^[0-9]+$ · requiredLoyalty program ID
userId^[0-9]+$ · requiredUser ID
Get member details › Responses
Default Response
statusAdjust member points
Manually adjust a member's points balance (add or remove points)
Permissions: 🟠loyalty.update
path Parameters
programId^[0-9]+$ · requiredLoyalty program ID
userId^[0-9]+$ · requiredUser ID
Adjust member points › Request Body
pointsPoints to add (positive) or remove (negative)
reasonHuman-readable reason for the adjustment
Adjust member points › Responses
Default Response
statusGet member redemptions
Get a member's reward redemption history
Permissions: 🔵 loyalty.read
path Parameters
programId^[0-9]+$ · requiredLoyalty program ID
userId^[0-9]+$ · requiredUser ID
Get member redemptions › Responses
Default Response
statusAssign tier to member
Manually assign a tier override to a loyalty program member. Assignment type is inferred from auth context (manual for staff JWT, campaign for API key). Optional expiration date.
Permissions: ⚪ loyalty.tier.assign
path Parameters
programId^[0-9]+$ · requiredLoyalty program ID
userId^[0-9]+$ · requiredUser ID
Assign tier to member › Request Body
tierIdTier ID to assign
expiresAtOptional expiration date (ISO 8601)
Assign tier to member › Responses
Default Response
statusRemove tier override from member
Remove a manual/campaign tier override from a loyalty program member, reverting to automatic point-calculated tier.
Permissions: ⚪ loyalty.tier.assign
path Parameters
programId^[0-9]+$ · requiredLoyalty program ID
userId^[0-9]+$ · requiredUser ID
Remove tier override from member › Responses
Default Response
statusGenerate wallet pass
Generate Apple or Google Wallet pass for loyalty member
path Parameters
programIdLoyalty program ID
userIdUser ID
query Parameters
platformapple (default) returns a .pkpass binary; google returns JSON { saveUrl }
Generate wallet pass › Responses
Apple Wallet Pass file (.pkpass)
Redeem a reward
Redeem a reward for a user, deducting points and generating a voucher code
Permissions: 🟢 loyalty.create
path Parameters
programId^[0-9]+$ · requiredLoyalty program ID
rewardId^[0-9]+$ · requiredReward catalog item ID
Redeem a reward › Responses
Default Response
statusCreate earning rule
Create a new earning rule for a loyalty program
Permissions: 🟢 loyalty.create
Create earning rule › Request Body
loyaltyProgramIdnameruleTypedescriptionisActiveminTierIdpointsPerCurrencyUnitminPurchaseAmountitemIdpointsModepointsPerItempointsMultiplierpointsPerVisitminPurchaseForVisitactionTypepointsPerActionmaxActionsPerPeriodactionPeriodvalidFromvalidUntilpriorityCreate earning rule › Responses
Default Response
statusUpdate earning rule
Update an existing earning rule
Permissions: 🟠loyalty.update
path Parameters
id^[0-9]+$ · requiredEarning rule ID
Update earning rule › Request Body
namedescriptionruleTypeisActiveminTierIdpointsPerCurrencyUnitminPurchaseAmountitemIdpointsModepointsPerItempointsMultiplierpointsPerVisitminPurchaseForVisitactionTypepointsPerActionmaxActionsPerPeriodactionPeriodvalidFromvalidUntilpriorityUpdate earning rule › Responses
Default Response
statusEnroll user in program
Enroll a single user in a loyalty program. Supports userId, email, or phone identification.
Permissions: 🟢 loyalty.create
Enroll user in program › Request Body
programIdLoyalty program ID
userIdUser ID (priority 1)
emailEmail address (priority 2)
phonePhone number (priority 3)
tierIdOptional tier ID to assign at enrollment (requires loyalty.tier.assign permission)
Enroll user in program › Responses
Default Response
statusBulk enroll users
Enroll multiple users in a loyalty program at once. When tierId is provided, the tier is applied to ALL users (new and already-enrolled).
Permissions: 🟢 loyalty.create
Bulk enroll users › Request Body
programIdLoyalty program ID
userIdsArray of user IDs to enroll
tierIdOptional tier ID to assign to ALL users (requires loyalty.tier.assign permission)
Bulk enroll users › Responses
Default Response
statusAward points
Award points to a user manually. Used for promotional points, customer service adjustments, or manual corrections.
Permissions: 🟢 loyalty.create
Award points › Request Body
userIdUser ID to award points to
loyaltyProgramIdLoyalty program ID
pointsNumber of points to award (must be positive)
descriptionReason for awarding points
Optional metadata for tracking
Award points › Responses
Points awarded successfully
statusClaim loyalty points for a past purchase
Retroactively claim loyalty points for a purchase made within the last 30 days.
Claim loyalty points for a past purchase › Request Body
userIdUser ID of the loyalty program member
loyaltyProgramIdLoyalty program ID
purchaseIntentIdPurchase intent ID from the completed purchase
Claim loyalty points for a past purchase › Responses
Points claimed or no points to award
transactionIdpointsAwardedmessagecreatedAtDeduct points
Deduct points from a user. Used for manual adjustments or corrections. For redemptions, use the redemption endpoints.
Permissions: 🟢 loyalty.create
Deduct points › Request Body
userIdUser ID to deduct points from
loyaltyProgramIdLoyalty program ID
pointsNumber of points to deduct (must be positive)
descriptionReason for deducting points
Optional metadata for tracking
Deduct points › Responses
Points deducted successfully
statusEstimate points for purchase
Estimate points that would be earned from a purchase. Used to display earning preview at checkout before the purchase is committed. No authentication required - called from storefront.
Estimate points for purchase › Request Body
loyaltyProgramIdLoyalty program ID
purchaseAmountCentsEstimated purchase amount in cents
itemIdsArray of item IDs in the cart (for item-based earning rules)
userTierIdUser tier ID for tier-specific multipliers (optional)
Estimate points for purchase › Responses
Points estimate calculated
statusProcess purchase points
Process points from a purchase. Called after a purchase is completed to calculate and award earned points based on earning rules.
Permissions: 🟢 loyalty.create
Process purchase points › Request Body
userIdUser ID who made the purchase
loyaltyProgramIdLoyalty program ID
purchaseIdPurchase ID to process
purchaseAmountCentsTotal purchase amount in cents
itemIdsArray of item IDs in the purchase (for item-based earning rules)
Process purchase points › Responses
Purchase processed (no points earned)
statusList loyalty programs
List loyalty programs with optional filtering
Permissions: 🔵 loyalty.read
query Parameters
locationIdFilter by location ID
isActiveFilter by active status
pagePage number
limitItems per page
List loyalty programs › Responses
Default Response
statusCreate loyalty program
Create a new loyalty program
Permissions: 🟢 loyalty.create
Create loyalty program › Request Body
nameProgram name
descriptionProgram description
currencyCurrency code
isActiveWhether program is active
startDateProgram start date
endDateProgram end date
loyaltyCardImageLoyalty card image URL
loyaltyColorLoyalty card color (hex)
Create loyalty program › Responses
Default Response
statusUpdate loyalty program
Update an existing loyalty program
Permissions: 🟠loyalty.update
path Parameters
id^[0-9]+$ · requiredLoyalty program ID
Update loyalty program › Request Body
nameProgram name
descriptionProgram description
currencyCurrency code
isActiveWhether program is active
startDateProgram start date
endDateProgram end date
loyaltyCardImageLoyalty card image URL
loyaltyColorLoyalty card color (hex)
Update loyalty program › Responses
Default Response
statusList points accounts
Get all points accounts for a loyalty program with pagination
Permissions: 🔵 loyalty.read
path Parameters
programId^[0-9]+$ · requiredLoyalty program ID
query Parameters
pagePage number
limitItems per page
List points accounts › Responses
Default Response
statusList rewards catalog
Get the rewards catalog for a loyalty program
Permissions: 🔵 loyalty.read
path Parameters
programId^[0-9]+$ · requiredLoyalty program ID
query Parameters
userId^[0-9]+$Optional user ID. When provided, rewards the user has already hit their max_redemptions_per_user for are filtered out.
List rewards catalog › Responses
Default Response
statusGet user points account
Get or create a points account for a specific user in a loyalty program
Permissions: 🔵 loyalty.read
path Parameters
programId^[0-9]+$ · requiredLoyalty program ID
userId^[0-9]+$ · requiredUser ID
Get user points account › Responses
Default Response
statusGet user redemptions
Get reward redemption history for a user in a loyalty program
Permissions: 🔵 loyalty.read
path Parameters
programId^[0-9]+$ · requiredLoyalty program ID
userId^[0-9]+$ · requiredUser ID
Get user redemptions › Responses
Default Response
statusCreate reward
Create a new reward in the catalog
Permissions: 🟢 loyalty.create
Create reward › Request Body
loyaltyProgramIdnamepointsCostdiscountIddescriptionminTierIdisActivestockQuantitymaxRedemptionsPerUseravailableFromavailableUntildisplayOrderexpirationDaysCreate reward › Responses
Default Response
statusUpdate reward
Update an existing reward in the catalog
Permissions: 🟠loyalty.update
path Parameters
id^[0-9]+$ · requiredReward ID
Update reward › Request Body
namedescriptionpointsCostminTierIddiscountIdisActivestockQuantitymaxRedemptionsPerUseravailableFromavailableUntildisplayOrderexpirationDaysUpdate reward › Responses
Default Response
statusCreate loyalty tier
Create a new tier for a loyalty program
Permissions: 🟢 loyalty.create
Create loyalty tier › Request Body
loyaltyProgramIdnamedescriptionpointsThresholdthresholdTyperollingPeriodMonthsRequired when thresholdType = ROLLING_PERIOD
tierCardImageUrlTier card image URL
tierColorTier card color (hex)
orderCreate loyalty tier › Responses
Default Response
statusUpdate loyalty tier
Update an existing loyalty tier
Permissions: 🟠loyalty.update
path Parameters
id^[0-9]+$ · requiredTier ID
Update loyalty tier › Request Body
nameTier name
descriptionTier description
pointsThresholdPoints required for this tier
thresholdTyperollingPeriodMonthstierCardImageUrlTier card image URL
tierColorTier card color (hex)
orderUpdate loyalty tier › Responses
Default Response
statusList points transactions
Get points transactions with optional filters (account, user, type, date range)
Permissions: 🔵 loyalty.read
query Parameters
pointsAccountIdFilter by points account ID
programIdFilter by loyalty program ID
userIdFilter by user ID
transactionTypeFilter by transaction type
startDateFilter by start date
endDateFilter by end date
pagelimitList points transactions › Responses
Default Response
statusGet user enrolled programs
Get all loyalty programs a user is enrolled in with account details and current tier. Users can only view their own enrollments. API keys with 'loyalty.read' permission can view any user's enrollments.
Permissions: 🔵 loyalty.read
path Parameters
userId^[0-9]+$ · requiredUser ID
Get user enrolled programs › Responses
Default Response
statusValidate loyalty members
Validate loyalty membership for multiple users by userId, email, phone, or cardId
Validate loyalty members › Request Body
Array of user identifiers to validate
Validate loyalty members › Responses
Loyalty validation results
statusWebhook: Loyalty identification (post-payment)
Fired after payment completion when a loyalty identification opportunity exists. Discriminated union on scenario. Fire-and-forget — never throws.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Loyalty identification (post-payment) › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Loyalty identification (post-payment) › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Loyalty program member joined
Fired when a user enrolls in a loyalty program. Used to trigger drip campaigns.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Loyalty program member joined › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Loyalty program member joined › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Loyalty member tier changed
Fired on promotion or demotion. previousTierId is null on first tier assignment.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Loyalty member tier changed › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Loyalty member tier changed › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Loyalty points awarded for purchase
Fired whenever points are awarded for a purchase — automatic post-payment, retroactive guest claim, or staff-linked. Storefront confirmation page subscribes via Ably to reflect "Processing…" → real points.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Loyalty points awarded for purchase › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Loyalty points awarded for purchase › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.