Get Available Offers
Get offers available to the member based on their tier, property, and eligibility
/members/me/loyalty/offersOverview
Returns offers available to the authenticated member based on their tier level, current location or property context, and eligibility criteria. Offers are point-based purchases for discounts, upgrades, and exclusive experiences.
Authentication
Requires a valid Clerk JWT token in the Authorization header.
Query Parameters
propertyIdquerystringProperty document ID to filter offers for a specific property
reservationIdquerystringReservation external ID for in-stay offers
categoryIdquerynumberFilter by offer category ID
redemptionTypequerystringFilter by redemption type: "direct", "externalCode", "propertySpecific", etc.
checkInDatequerystringCheck-in date for stay-based offers (ISO 8601 date)
latitudequerynumberLatitude for location-based offers (-90 to 90)
longitudequerynumberLongitude for location-based offers (-180 to 180)
radiusquerynumberSearch radius in kilometers (default: 50)
limitquerynumberMaximum number of offers to return (default: 20, max: 100)
offsetquerynumberNumber of offers to skip for pagination (default: 0)
Request
curl -X GET "http://localhost:3000/v1/members/me/loyalty/offers?propertyId=abc123&limit=10" \
-H "Authorization: Bearer YOUR_CLERK_JWT"Response
itemsarrayrequiredList of available offers
array items
offerIdstringrequiredOffer document ID
namestringrequiredDisplay name of the offer
shortDescriptionstringBrief description for card display
descriptionstringFull description of the offer
pointsRequirednumberrequiredPoints cost to claim this offer
retailValuenumberRetail value of the offer in dollars
discountAmountnumberDollar amount of discount if applicable
discountTypestringType of discount: "percentage", "fixed", etc.
redemptionTypestringrequiredHow offer is redeemed: "direct", "externalCode", "propertySpecific", etc.
categoryobjectOffer category information
properties
idnumberrequiredCategory ID
namestringrequiredCategory name
heroImageUrlstringURL for hero image
cardImageUrlstringURL for card thumbnail image
howToRedeemstringInstructions for redeeming the offer
termsAndConditionsstringTerms and conditions text
isEligiblebooleanrequiredWhether the member can claim this offer
eligibilityReasonstringReason if not eligible (e.g., "Insufficient points", "Tier too low")
restrictionsarrayActive restrictions preventing claim
array items
typestringrequiredRestriction type: "requires_stay", "check_in_window"
messagestringrequiredHuman-readable restriction message
detailsobjectAdditional restriction details
requiresStaybooleanrequiredWhether offer requires an active reservation
disableBeforeCheckInHoursnumberHours before check-in when offer becomes unavailable
validUntilstringISO 8601 timestamp when offer expires
isCustomOfferbooleanWhether this is a custom/personalized offer
isGlobalbooleanWhether this offer is available globally
propertyDocumentIdstringPrimary property document ID for property-specific offers
totalnumberrequiredTotal number of offers matching filters
offsetnumberCurrent pagination offset
limitnumberCurrent pagination limit
Response
{
"items": [
{
"offerId": "offer_spa_discount",
"name": "Spa Treatment Discount",
"shortDescription": "25% off all spa treatments",
"description": "Enjoy a 25% discount on any spa treatment at our luxury wellness center",
"pointsRequired": 1500,
"retailValue": 200,
"discountAmount": 50,
"discountType": "percentage",
"redemptionType": "propertySpecific",
"category": {
"id": 3,
"name": "Spa & Wellness"
},
"heroImageUrl": "https://cdn.journey.com/offers/spa-hero.jpg",
"cardImageUrl": "https://cdn.journey.com/offers/spa-card.jpg",
"howToRedeem": "Present your verification code at the spa reception",
"termsAndConditions": "Valid for single use per stay. Subject to availability.",
"isEligible": true,
"eligibilityReason": null,
"restrictions": [],
"requiresStay": true,
"disableBeforeCheckInHours": 24,
"validUntil": "2024-12-31T23:59:59Z",
"isCustomOffer": false,
"isGlobal": false,
"propertyDocumentId": "prop_luxury_resort"
},
{
"offerId": "offer_dining_credit",
"name": "Dining Credit",
"shortDescription": "$75 dining credit",
"description": "Enjoy a $75 credit towards any dining experience at our restaurants",
"pointsRequired": 2000,
"retailValue": 75,
"redemptionType": "direct",
"category": {
"id": 1,
"name": "Dining"
},
"heroImageUrl": "https://cdn.journey.com/offers/dining-hero.jpg",
"cardImageUrl": "https://cdn.journey.com/offers/dining-card.jpg",
"howToRedeem": "Credit will be automatically applied to your room account",
"isEligible": false,
"eligibilityReason": "Insufficient points (2000 required, 1800 available)",
"restrictions": [
{
"type": "requires_stay",
"message": "This offer requires an active reservation",
"details": {}
}
],
"requiresStay": true,
"disableBeforeCheckInHours": null,
"validUntil": "2024-12-31T23:59:59Z",
"isCustomOffer": false,
"isGlobal": false,
"propertyDocumentId": "prop_luxury_resort"
}
],
"total": 12,
"offset": 0,
"limit": 10
}Offer Filtering
Property Context
- propertyId: Returns offers available at that specific property
- reservationId: Returns offers for your current/future stay at that property
- checkInDate: Filters offers based on your check-in date
Location Context
- latitude/longitude/radius: Returns offers available within the specified area
- Useful for discovering offers near your current location
Category Filtering
- categoryId: Filter by specific category like "Dining", "Spa & Wellness", "Activities"
- redemptionType: Filter by how offers are redeemed
Related Endpoints
- Get Offer Details - Get full details of a specific offer
- Claim Offer - Purchase an offer with points
- Get Wallet Balance - Check available points