API Reference

Loyalty

Run a business's loyalty program: stamp cards or points, wallet push campaigns, manual point adjustments, and reward redemptions. Loyalty programs are a PRO feature.

Scope and plan

Reads require loyalty:read, mutations require loyalty:write. Every loyalty route requires the PRO plan. The destructive deletes (campaigns and templates) and any refund-style reversals are intentionally blocked for API-key auth.

Get loyalty stats

GET/loyalty/business/{businessId}/stats
loyalty:readPRO plan

Members count, wallet installs, points and stamps issued, campaign and retention metrics, plus a 30-day timeseries.

curl "https://api.salonify.eu/api/v1/loyalty/business/b_8f3a/stats" \
  -H "X-API-Key: sk_live_..."
{
  "members": 412,
  "walletInstalls": 188,
  "pointsIssued": 84200,
  "stampsIssued": 0,
  "rewardsRedeemed": 73,
  "activeCampaigns": 2,
  "timeseries": [
    { "date": "2026-06-01", "newMembers": 4, "pointsIssued": 1200 }
  ]
}

List loyalty cards

GET/loyalty/business/{businessId}/cards
loyalty:readPRO plan
curl "https://api.salonify.eu/api/v1/loyalty/business/b_8f3a/cards" \
  -H "X-API-Key: sk_live_..."
[
  {
    "id": "lc_551",
    "customerId": "cu_9a21",
    "currentStamps": 6,
    "totalStamps": 26,
    "points": 1240,
    "rewardsRedeemed": 1,
    "isActive": true
  }
]

Get the activity feed

GET/loyalty/business/{businessId}/activity
loyalty:readPRO plan

Query parameters

NameTypeRequiredDescription
limitintegerOptionalPage size.
cursorstringOptionalCursor returned by the previous page.
typestringOptionalFilter by activity type.
curl "https://api.salonify.eu/api/v1/loyalty/business/b_8f3a/activity?limit=20" \
  -H "X-API-Key: sk_live_..."
{
  "items": [
    { "id": "ev_9", "type": "STAMP_ADDED", "cardId": "lc_551", "amount": 1, "at": "2026-06-21T14:02:00.000Z" }
  ],
  "nextCursor": "ev_8"
}

Add stamps

POST/loyalty/stamps
loyalty:writePRO plan

Body parameters

NameTypeRequiredDescription
cardIduuidRequiredThe loyalty card to stamp.
countintegerOptionalNumber of stamps (1-10). Defaults to 1.
bookingIduuidOptionalAssociate with a booking.
notestringOptionalOptional note.
curl -X POST "https://api.salonify.eu/api/v1/loyalty/stamps" \
  -H "X-API-Key: sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "cardId": "lc_551", "count": 1 }'
{ "cardId": "lc_551", "currentStamps": 7, "rewardEarned": false }

Adjust points

POST/loyalty/points/adjust
loyalty:writePRO plan

Manually award (positive) or deduct (negative) points. The balance is floored at zero.

Body parameters

NameTypeRequiredDescription
cardIduuidRequiredThe loyalty card.
amountintegerRequiredPoints to add or remove (-100000 to 100000).
notestringOptionalReason for the adjustment.
curl -X POST "https://api.salonify.eu/api/v1/loyalty/points/adjust" \
  -H "X-API-Key: sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "cardId": "lc_551", "amount": 100, "note": "Goodwill" }'
{ "cardId": "lc_551", "points": 1340 }

Create a wallet campaign

POST/loyalty/campaigns
loyalty:writePRO plan

Body parameters

NameTypeRequiredDescription
businessIduuidRequiredYour business id.
titlestringRequiredWallet message header.
messagestringRequiredCampaign body.
segmentenumOptionalALL (default), STAMPS_NEAR_REWARD, POINTS_MIN, INACTIVE_30D.
segmentValueintegerOptionalThreshold for the chosen segment.
bonusPointsintegerOptionalPoints or stamps granted to each recipient on send.
scheduledAtstringOptionalISO date. If set the campaign is SCHEDULED, otherwise DRAFT.
curl -X POST "https://api.salonify.eu/api/v1/loyalty/campaigns" \
  -H "X-API-Key: sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "businessId": "b_8f3a",
    "title": "20% off this week",
    "message": "Show this in store",
    "segment": "INACTIVE_30D"
  }'
{ "id": "cp_44", "title": "20% off this week", "status": "DRAFT", "segment": "INACTIVE_30D" }

Send a campaign

POST/loyalty/campaigns/{id}/send
loyalty:writePRO plan
curl -X POST "https://api.salonify.eu/api/v1/loyalty/campaigns/cp_44/send" \
  -H "X-API-Key: sk_live_..."
{ "id": "cp_44", "status": "SENT", "recipients": 96 }

Not available via API key

These routes can only be called with a logged-in dashboard session, never an API key:
  • DELETE /loyalty/campaigns/{id} (delete a campaign)
  • DELETE /loyalty/campaign-templates/{id} (delete a template)
  • Any reward or point reversal of a financial nature.
Calling them with an API key returns 403 FORBIDDEN_FOR_API_KEY.

Programs, campaigns list, and templates

Create or update a program with POST/PATCH /loyalty/programs (loyalty:write). List campaigns at /loyalty/campaigns/business/{businessId} and templates at /loyalty/campaign-templates/business/{businessId} (both loyalty:read). Create a template with POST /loyalty/campaign-templates (loyalty:write). Remove stamps with POST /loyalty/stamps/remove and redeem a reward with POST /loyalty/redeem.