← Headless SDK
Progression Hooks
Access gamification data — points, badges, tiers, leaderboards, rewards, and challenges. All hooks auto-refresh on relevant events and support manual refresh.
usePoints
const points = usePoints({ engagementId: 'YOUR_UUID' });
points.balance // number — current balance
points.totalEarned // number — lifetime earned
points.currentTier // { tier_name, tier_level, color } | null
points.transactions // PointsTransaction[] — recent history
points.isLoading // boolean
points.refresh() // Manual refresh
// Auto-refreshes when:
// - points:awarded event fires
// - tier:changed event firesuseTier
const tier = useTier({ engagementId: 'YOUR_UUID' });
tier.currentTier // CurrentTier | null
tier.tierName // string | null (e.g. "Gold")
tier.tierLevel // number (e.g. 3)
tier.tierColor // string | null (hex color)
tier.pointsToNext // number | null (points needed for next tier)
tier.nextTierName // string | null
tier.isLoading // boolean
tier.refresh() // Manual refreshuseBadgesHeadless
const badges = useBadgesHeadless({
engagementId: 'YOUR_UUID',
badgeCodes: ['first_quiz', 'streak_7', 'top_scorer'], // optional filter
refreshInterval: 30000, // ms, default 30s
});
badges.badges // BadgeStatusEntry[] — all badges
badges.earned // BadgeStatusEntry[] — earned only
badges.unearned // BadgeStatusEntry[] — not yet earned
badges.isLoading // boolean
badges.refresh() // Manual refresh
badges.isEarned('code') // Check if a specific badge is earned
// Each badge: { code, name, description, icon, rarity, earned, earnedAt }
// Auto-refreshes every 30s + instantly on badge:unlocked eventsuseChallenge
Full challenge lifecycle — load, enroll, track progress, and display leaderboard.
const challenge = useChallenge({
engagementId: 'YOUR_UUID',
autoEnroll: true, // Auto-enroll on load (default: false)
refreshInterval: 30000, // ms
});
// Challenge definition
challenge.challenge // ChallengeDetail | null
challenge.objectives // ChallengeObjective[]
challenge.milestones // ChallengeMilestone[]
// Enrollment
challenge.isEnrolled // boolean
challenge.enroll() // Manual enroll action
// Progress
challenge.progress // ChallengeProgress | null
challenge.progressPercentage // number (0-100)
challenge.objectiveProgress // ObjectiveProgress[]
challenge.completedObjectives // number
challenge.totalObjectives // number
// Leaderboard
challenge.leaderboard // LeaderboardEntry[]
challenge.myRank // number | null
// State
challenge.isLoading // boolean
challenge.error // Error | null
challenge.refresh() // Manual refresh
// Auto-refreshes on activity:completed eventsuseLeaderboard
Supports both progression leaderboards (by code) and challenge leaderboards.
// Progression leaderboard (by code)
const lb = useLeaderboard({
code: 'main_leaderboard',
engagementId: 'YOUR_UUID',
limit: 20,
refreshInterval: 30000,
});
// Or challenge leaderboard (by challengeId)
const lb = useLeaderboard({
challengeId: 'CHALLENGE_UUID',
engagementId: 'YOUR_UUID',
limit: 10,
});
lb.entries // LeaderboardEntry[] — { rank, name, score, userId, change }
lb.myRank // number | null
lb.totalParticipants // number
lb.isLoading // boolean
lb.refresh() // Manual refreshuseRewardsHeadless
const rewards = useRewardsHeadless({ engagementId: 'YOUR_UUID' });
rewards.rewards // ClaimedReward[] — all claimed rewards
rewards.totalClaimed // number
rewards.isLoading // boolean
rewards.refresh() // Manual refresh
// Each reward: { id, rewardName, rewardType, codeValue, value, claimedAt, expiresAt }
// Auto-refreshes instantly on reward:claimed events