Journey Docs
Members APILoyalty

Get Available Offers

Get offers available to the member based on their tier, property, and eligibility

GET/members/me/loyalty/offers

Overview

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

propertyIdquerystring

Property document ID to filter offers for a specific property

reservationIdquerystring

Reservation external ID for in-stay offers

categoryIdquerynumber

Filter by offer category ID

redemptionTypequerystring

Filter by redemption type: "direct", "externalCode", "propertySpecific", etc.

checkInDatequerystring

Check-in date for stay-based offers (ISO 8601 date)

latitudequerynumber

Latitude for location-based offers (-90 to 90)

longitudequerynumber

Longitude for location-based offers (-180 to 180)

radiusquerynumber

Search radius in kilometers (default: 50)

limitquerynumber

Maximum number of offers to return (default: 20, max: 100)

offsetquerynumber

Number 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

itemsarrayrequired

List of available offers

array items
offerIdstringrequired

Offer document ID

namestringrequired

Display name of the offer

shortDescriptionstring

Brief description for card display

descriptionstring

Full description of the offer

pointsRequirednumberrequired

Points cost to claim this offer

retailValuenumber

Retail value of the offer in dollars

discountAmountnumber

Dollar amount of discount if applicable

discountTypestring

Type of discount: "percentage", "fixed", etc.

redemptionTypestringrequired

How offer is redeemed: "direct", "externalCode", "propertySpecific", etc.

categoryobject

Offer category information

properties
idnumberrequired

Category ID

namestringrequired

Category name

heroImageUrlstring

URL for hero image

cardImageUrlstring

URL for card thumbnail image

howToRedeemstring

Instructions for redeeming the offer

termsAndConditionsstring

Terms and conditions text

isEligiblebooleanrequired

Whether the member can claim this offer

eligibilityReasonstring

Reason if not eligible (e.g., "Insufficient points", "Tier too low")

restrictionsarray

Active restrictions preventing claim

array items
typestringrequired

Restriction type: "requires_stay", "check_in_window"

messagestringrequired

Human-readable restriction message

detailsobject

Additional restriction details

requiresStaybooleanrequired

Whether offer requires an active reservation

disableBeforeCheckInHoursnumber

Hours before check-in when offer becomes unavailable

validUntilstring

ISO 8601 timestamp when offer expires

isCustomOfferboolean

Whether this is a custom/personalized offer

isGlobalboolean

Whether this offer is available globally

propertyDocumentIdstring

Primary property document ID for property-specific offers

totalnumberrequired

Total number of offers matching filters

offsetnumber

Current pagination offset

limitnumber

Current pagination limit

Response

200 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

On this page