Skip to main content

WordPress REST API Reference

Complete reference for all REST API endpoints provided by the Loyalteez WordPress plugin. These endpoints enable JavaScript interactions with loyalty features.


Base URL

All endpoints use the WordPress REST API base URL:

/wp-json/loyalteez/v1

Full Base URL:

https://yoursite.com/wp-json/loyalteez/v1

Authentication

Endpoints Requiring Authentication

Most endpoints require the user to be logged in to WordPress. WordPress automatically handles authentication via:

  • WordPress Nonce: Included in requests via X-WP-Nonce header
  • Cookie Authentication: WordPress session cookies
  • Application Passwords: For programmatic access

Nonce Generation

WordPress nonces are generated using wp_create_nonce('wp_rest'):

wp_localize_script('your-script', 'loyalteezData', [
'nonce' => wp_create_nonce('wp_rest')
]);

JavaScript Requests

Include the nonce in requests:

fetch('/wp-json/loyalteez/v1/checkin', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': loyalteezData.nonce
},
credentials: 'same-origin'
});

Endpoints

POST /checkin

Daily check-in endpoint for recording user activity and maintaining streaks.

Authentication: Required (logged in user)

Request Body: None (user is determined from WordPress session)

Response:

{
"success": true,
"streak": {
"currentStreak": 7,
"multiplier": 1.5,
"nextMilestone": {
"days": 10,
"bonus": 100
},
"unclaimedMilestones": [
{
"days": 7,
"bonus": 50
}
]
},
"reward": 15,
"alreadyClaimed": false
}

Response Fields:

FieldTypeDescription
successbooleanWhether the check-in was successful
streak.currentStreakintegerCurrent streak count in days
streak.multipliernumberCurrent streak multiplier
streak.nextMilestoneobject|nullNext milestone information
streak.nextMilestone.daysintegerDays required for milestone
streak.nextMilestone.bonusintegerLTZ bonus for milestone
streak.unclaimedMilestonesarrayList of unclaimed milestones
rewardintegerLTZ reward for this check-in (0 if already claimed)
alreadyClaimedbooleanWhether user already checked in today

Error Responses:

{
"code": "not_logged_in",
"message": "User must be logged in",
"data": {
"status": 401
}
}
{
"code": "not_configured",
"message": "Loyalteez is not configured",
"data": {
"status": 500
}
}
{
"code": "checkin_failed",
"message": "Failed to check in",
"data": {
"status": 400
}
}

Usage Example:

fetch('/wp-json/loyalteez/v1/checkin', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': loyalteezData.nonce
},
credentials: 'same-origin'
})
.then(response => response.json())
.then(data => {
if (data.success) {
console.log(`Streak: ${data.streak.currentStreak} days`);
console.log(`Reward: ${data.reward} LTZ`);
} else {
console.error('Check-in failed:', data.message);
}
});

POST /redeem

Redeem a perk using LTZ tokens.

Authentication: Required (logged in user)

Request Body:

{
"perkId": "550e8400-e29b-41d4-a716-446655440000"
}

Request Parameters:

ParameterTypeRequiredDescription
perkIdstringYesUUID of the perk to redeem

Response:

{
"success": true,
"confirmationCode": "ABC123XYZ",
"perk": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Discount Code",
"cost": 500,
"category": "discount"
}
}

Response Fields:

FieldTypeDescription
successbooleanWhether redemption was successful
confirmationCodestring|nullConfirmation code for redeemed perk
perkobject|nullRedeemed perk information

Error Responses:

{
"code": "not_logged_in",
"message": "User must be logged in",
"data": {
"status": 401
}
}
{
"code": "missing_perk_id",
"message": "Perk ID is required",
"data": {
"status": 400
}
}
{
"code": "redeem_failed",
"message": "Insufficient balance",
"data": {
"status": 400
}
}

Usage Example:

fetch('/wp-json/loyalteez/v1/redeem', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': loyalteezData.nonce
},
credentials: 'same-origin',
body: JSON.stringify({
perkId: '550e8400-e29b-41d4-a716-446655440000'
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
console.log('Perk redeemed:', data.perk.name);
console.log('Confirmation code:', data.confirmationCode);
} else {
console.error('Redemption failed:', data.message);
}
});

POST /claim-milestone

Claim a streak milestone bonus.

Authentication: Required (logged in user)

Request Body:

{
"milestoneDays": 7
}

Request Parameters:

ParameterTypeRequiredDescription
milestoneDaysintegerYesDays milestone to claim (e.g., 7, 30, 100)

Response:

{
"success": true,
"bonusLtz": 100,
"milestone": 7
}

Response Fields:

FieldTypeDescription
successbooleanWhether milestone claim was successful
bonusLtzintegerLTZ bonus awarded for milestone
milestoneintegerMilestone days that were claimed

Error Responses:

{
"code": "not_logged_in",
"message": "User must be logged in",
"data": {
"status": 401
}
}
{
"code": "missing_milestone",
"message": "Milestone days is required",
"data": {
"status": 400
}
}
{
"code": "claim_failed",
"message": "Milestone not available or already claimed",
"data": {
"status": 400
}
}

Usage Example:

fetch('/wp-json/loyalteez/v1/claim-milestone', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': loyalteezData.nonce
},
credentials: 'same-origin',
body: JSON.stringify({
milestoneDays: 7
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
console.log(`Claimed ${data.milestone}-day milestone!`);
console.log(`Bonus: ${data.bonusLtz} LTZ`);
} else {
console.error('Claim failed:', data.message);
}
});

GET /leaderboard

Get leaderboard rankings by various metrics.

Authentication: Not required (public endpoint)

Query Parameters:

ParameterTypeDefaultDescription
metricstringltz_earnedRanking metric: ltz_earned, activity, or streak
periodstringweekTime period: week, month, or all
limitinteger10Number of users to return

Response:

{
"success": true,
"leaderboard": [
{
"userIdentifier": "[email protected]",
"username": "user1",
"value": 5240,
"rank": 1
},
{
"userIdentifier": "[email protected]",
"username": "user2",
"value": 3890,
"rank": 2
}
],
"metric": "ltz_earned",
"period": "week",
"total": 2
}

Response Fields:

FieldTypeDescription
successbooleanWhether request was successful
leaderboardarrayList of ranked users
leaderboard[].userIdentifierstringUser identifier
leaderboard[].usernamestringUser display name
leaderboard[].valuenumberValue for selected metric
leaderboard[].rankintegerUser's rank (1-based)
metricstringMetric used for ranking
periodstringTime period for ranking
totalintegerTotal number of users in leaderboard

Error Responses:

{
"code": "not_configured",
"message": "Loyalteez is not configured",
"data": {
"status": 500
}
}
{
"code": "api_error",
"message": "Failed to fetch leaderboard",
"data": {
"status": 500
}
}

Usage Example:

fetch('/wp-json/loyalteez/v1/leaderboard?metric=activity&period=month&limit=20')
.then(response => response.json())
.then(data => {
if (data.success) {
data.leaderboard.forEach(user => {
console.log(`${user.rank}. ${user.username}: ${user.value}`);
});
} else {
console.error('Failed to fetch leaderboard:', data.message);
}
});

Error Handling

Standard Error Format

All endpoints return errors in WordPress REST API standard format:

{
"code": "error_code",
"message": "Human-readable error message",
"data": {
"status": 400
}
}

HTTP Status Codes

Status CodeMeaningWhen It Occurs
200OKRequest succeeded
400Bad RequestInvalid parameters or request body
401UnauthorizedUser not logged in (for authenticated endpoints)
500Internal Server ErrorPlugin not configured or API error

Common Error Codes

Error CodeStatusDescription
not_logged_in401User must be logged in
not_configured500Loyalteez plugin not configured
missing_perk_id400Perk ID parameter missing
missing_milestone400Milestone days parameter missing
checkin_failed400Failed to check in (already claimed, API error, etc.)
redeem_failed400Failed to redeem perk (insufficient balance, perk not available, etc.)
claim_failed400Failed to claim milestone (not available, already claimed, etc.)
api_error500Error communicating with Loyalteez API

JavaScript Integration

Complete Example

// Initialize (usually done via wp_localize_script)
const loyalteezData = {
nonce: 'abc123...', // Generated by wp_create_nonce('wp_rest')
apiUrl: '/wp-json/loyalteez/v1'
};

// Daily check-in
async function checkIn() {
try {
const response = await fetch(`${loyalteezData.apiUrl}/checkin`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': loyalteezData.nonce
},
credentials: 'same-origin'
});

const data = await response.json();

if (data.success) {
console.log(`Check-in successful! Streak: ${data.streak.currentStreak} days`);
return data;
} else {
throw new Error(data.message);
}
} catch (error) {
console.error('Check-in error:', error);
throw error;
}
}

// Redeem perk
async function redeemPerk(perkId) {
try {
const response = await fetch(`${loyalteezData.apiUrl}/redeem`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': loyalteezData.nonce
},
credentials: 'same-origin',
body: JSON.stringify({ perkId })
});

const data = await response.json();

if (data.success) {
console.log(`Perk redeemed: ${data.perk.name}`);
return data;
} else {
throw new Error(data.message);
}
} catch (error) {
console.error('Redemption error:', error);
throw error;
}
}

// Claim milestone
async function claimMilestone(milestoneDays) {
try {
const response = await fetch(`${loyalteezData.apiUrl}/claim-milestone`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': loyalteezData.nonce
},
credentials: 'same-origin',
body: JSON.stringify({ milestoneDays })
});

const data = await response.json();

if (data.success) {
console.log(`Milestone claimed: ${data.bonusLtz} LTZ`);
return data;
} else {
throw new Error(data.message);
}
} catch (error) {
console.error('Milestone claim error:', error);
throw error;
}
}

// Get leaderboard
async function getLeaderboard(metric = 'ltz_earned', period = 'week', limit = 10) {
try {
const params = new URLSearchParams({ metric, period, limit });
const response = await fetch(`${loyalteezData.apiUrl}/leaderboard?${params}`);

const data = await response.json();

if (data.success) {
return data.leaderboard;
} else {
throw new Error(data.message);
}
} catch (error) {
console.error('Leaderboard error:', error);
throw error;
}
}

Testing

Using cURL

Check-in:

curl -X POST https://yoursite.com/wp-json/loyalteez/v1/checkin \
-H "Content-Type: application/json" \
-H "X-WP-Nonce: YOUR_NONCE" \
--cookie "wordpress_logged_in_XXX=COOKIE_VALUE"

Redeem Perk:

curl -X POST https://yoursite.com/wp-json/loyalteez/v1/redeem \
-H "Content-Type: application/json" \
-H "X-WP-Nonce: YOUR_NONCE" \
--cookie "wordpress_logged_in_XXX=COOKIE_VALUE" \
-d '{"perkId":"550e8400-e29b-41d4-a716-446655440000"}'

Get Leaderboard:

curl "https://yoursite.com/wp-json/loyalteez/v1/leaderboard?metric=activity&period=month&limit=10"


Need help? [email protected]