# Get Earn More Gallery
> Source: /api-reference/members/me/discover/get-earn-more
> Get properties with active campaigns offering bonus points
> Endpoint: GET /members/me/features/discover/galleries/earn-more

## Overview [#overview]

Returns properties with active campaigns offering bonus points. These are properties where members can earn additional points beyond the standard earning rate, often through promotional campaigns or special partnerships.

## Authentication [#authentication]

Requires a valid Clerk JWT token in the Authorization header.

## Query Parameters [#query-parameters]

<ParamField query="limit" type="number">
  Maximum number of items to return
</ParamField>

<ParamField query="offset" type="number">
  Number of items to skip for pagination
</ParamField>

<RequestExample>

```bash cURL
curl -X GET "http://localhost:3000/v1/members/me/features/discover/galleries/earn-more" \
  -H "Authorization: Bearer YOUR_CLERK_JWT"
```

```typescript TypeScript
const getEarnMoreGallery = async (limit = 20, offset = 0) => {
  const response = await fetch(`http://localhost:3000/v1/members/me/features/discover/galleries/earn-more?limit=${limit}&offset=${offset}`, {
    method: 'GET',
    headers: {
      'Authorization': 'Bearer YOUR_CLERK_JWT'
    }
  });
  
  return response.json();
};
```

</RequestExample>

## Response [#response]

This endpoint returns properties with bonus earning campaigns, typically with additional campaign information.

<ResponseField name="items" type="array" required>
  Array of properties with active bonus campaigns
  
  <Expandable title="array items">
    <ResponseField name="property" type="object" required>
      Property information with campaign details
    </ResponseField>
    
    <ResponseField name="campaign" type="object">
      Bonus earning campaign information
      
      <Expandable title="campaign object">
        <ResponseField name="id" type="string">
          Campaign identifier
        </ResponseField>
        
        <ResponseField name="name" type="string">
          Campaign name
        </ResponseField>
        
        <ResponseField name="bonusMultiplier" type="number">
          Points multiplier (e.g., 2.0 for double points)
        </ResponseField>
        
        <ResponseField name="bonusAmount" type="number">
          Fixed bonus points amount
        </ResponseField>
        
        <ResponseField name="description" type="string">
          Campaign description
        </ResponseField>
        
        <ResponseField name="validFrom" type="string">
          Campaign start date (ISO 8601)
        </ResponseField>
        
        <ResponseField name="validTo" type="string">
          Campaign end date (ISO 8601)
        </ResponseField>
        
        <ResponseField name="terms" type="string">
          Campaign terms and conditions
        </ResponseField>
      </Expandable>
    </ResponseField>
    
    <ResponseField name="baseEarningRate" type="number">
      Standard points per dollar spent
    </ResponseField>
    
    <ResponseField name="bonusEarningRate" type="number">
      Enhanced points per dollar with campaign
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="total" type="number" required>
  Total number of properties with bonus campaigns
</ResponseField>

<ResponseExample>

```json 200 Response - Bonus Earning Properties
{
  "items": [
    {
      "property": {
        "id": 201,
        "documentId": "prop_luxury_resort_miami",
        "name": "Miami Beach Luxury Resort",
        "brandName": "Journey Shores",
        "type": "Resort",
        "baseRoomCategory": "Ocean Suite",
        "nightlyCost": 85000,
        "guestRating": 4.7,
        "maxGuests": 4,
        "amenities": ["Private Beach", "Spa", "Multiple Restaurants", "Pool Complex"],
        "address": {
          "city": "Miami Beach",
          "state": "Florida",
          "country": "United States",
          "latitude": 25.7617,
          "longitude": -80.1918
        },
        "heroImage": {
          "url": "https://cdn.example.com/properties/miami-resort-hero.jpg",
          "alt": "Miami beach resort with ocean view"
        },
        "gallery": [
          {
            "url": "https://cdn.example.com/properties/miami-resort-1.jpg",
            "alt": "Resort pool deck"
          }
        ]
      },
      "campaign": {
        "id": "summer_2024_triple_points",
        "name": "Summer Triple Points",
        "bonusMultiplier": 3.0,
        "bonusAmount": null,
        "description": "Earn triple points on all stays during summer season",
        "validFrom": "2024-06-01T00:00:00Z",
        "validTo": "2024-08-31T23:59:59Z",
        "terms": "Valid for new bookings only. Cannot be combined with other offers."
      },
      "baseEarningRate": 5,
      "bonusEarningRate": 15
    },
    {
      "property": {
        "id": 202,
        "documentId": "prop_mountain_lodge_colorado",
        "name": "Colorado Mountain Lodge",
        "brandName": "Journey Peaks",
        "type": "Lodge",
        "baseRoomCategory": "Alpine Room",
        "nightlyCost": 35000,
        "guestRating": 4.5,
        "maxGuests": 6,
        "amenities": ["Ski Access", "Hot Tub", "Mountain Views", "Restaurant"],
        "address": {
          "city": "Aspen",
          "state": "Colorado", 
          "country": "United States",
          "latitude": 39.1911,
          "longitude": -106.8175
        },
        "heroImage": {
          "url": "https://cdn.example.com/properties/colorado-lodge-hero.jpg",
          "alt": "Mountain lodge in winter setting"
        },
        "gallery": [
          {
            "url": "https://cdn.example.com/properties/colorado-lodge-1.jpg",
            "alt": "Lodge interior with fireplace"
          }
        ]
      },
      "campaign": {
        "id": "ski_season_bonus_2024",
        "name": "Ski Season Bonus",
        "bonusMultiplier": null,
        "bonusAmount": 5000,
        "description": "Earn 5,000 bonus points per night during ski season",
        "validFrom": "2024-12-01T00:00:00Z",
        "validTo": "2025-03-31T23:59:59Z",
        "terms": "Minimum 2-night stay required. Bonus points awarded after checkout."
      },
      "baseEarningRate": 5,
      "bonusEarningRate": 5
    },
    {
      "property": {
        "id": 203,
        "documentId": "prop_urban_hotel_nyc",
        "name": "Manhattan Business Hotel",
        "brandName": "Journey Urban",
        "type": "Hotel",
        "baseRoomCategory": "Executive Room",
        "nightlyCost": 55000,
        "guestRating": 4.4,
        "maxGuests": 2,
        "amenities": ["Business Center", "Fitness Center", "Restaurant", "Concierge"],
        "address": {
          "city": "New York",
          "state": "New York",
          "country": "United States",
          "latitude": 40.7589,
          "longitude": -73.9851
        },
        "heroImage": {
          "url": "https://cdn.example.com/properties/nyc-hotel-hero.jpg",
          "alt": "Modern hotel in Manhattan"
        },
        "gallery": [
          {
            "url": "https://cdn.example.com/properties/nyc-hotel-1.jpg",
            "alt": "Executive room with city view"
          }
        ]
      },
      "campaign": {
        "id": "business_travel_double_2024",
        "name": "Business Travel Double Points",
        "bonusMultiplier": 2.0,
        "bonusAmount": null,
        "description": "Double points for stays Sunday-Thursday",
        "validFrom": "2024-01-01T00:00:00Z",
        "validTo": "2024-12-31T23:59:59Z",
        "terms": "Valid for Sunday-Thursday arrivals only. Weekend stays not eligible."
      },
      "baseEarningRate": 5,
      "bonusEarningRate": 10
    }
  ],
  "total": 15
}
```

</ResponseExample>

## Campaign Types [#campaign-types]

### Multiplier Campaigns [#multiplier-campaigns]
- **Type**: Point multipliers (2x, 3x, etc.)
- **Calculation**: Base rate × multiplier
- **Example**: Standard 5 pts/$ becomes 15 pts/$ with 3x multiplier
- **Use Case**: Seasonal promotions, special events

### Fixed Bonus Campaigns [#fixed-bonus-campaigns]
- **Type**: Fixed bonus points per night/stay
- **Calculation**: Base rate + fixed bonus
- **Example**: Standard 5 pts/$ + 5,000 bonus points per night
- **Use Case**: Property launches, partnership promotions

### Hybrid Campaigns [#hybrid-campaigns]
- **Type**: Combination of multiplier and fixed bonus
- **Calculation**: (Base rate × multiplier) + fixed bonus
- **Example**: Double points + 2,500 bonus per night
- **Use Case**: Major promotional events

## Use Cases [#use-cases]

### Bonus Campaign Display [#bonus-campaign-display]
```typescript
const BonusPropertyCard = ({ item }) => {
  const { property, campaign, baseEarningRate, bonusEarningRate } = item;
  
  const calculateSavings = () => {
    if (campaign.bonusMultiplier) {
      const bonusPoints = baseEarningRate * (campaign.bonusMultiplier - 1);
      return `${bonusPoints}x bonus points`;
    }
    
    if (campaign.bonusAmount) {
      return `+${campaign.bonusAmount.toLocaleString()} bonus points per night`;
    }
    
    return 'Bonus earning opportunity';
  };
  
  return (
    <div className="bonus-property-card">
      <div className="campaign-badge">
        {campaign.name}
      </div>
      
      <img src={property.heroImage?.url} alt={property.heroImage?.alt} />
      
      <div className="property-info">
        <h3>{property.name}</h3>
        <p>{property.address?.city}, {property.address?.country}</p>
        
        <div className="earning-info">
          <span className="base-rate">Usually {baseEarningRate} pts/$</span>
          <span className="bonus-rate">Now {bonusEarningRate} pts/$</span>
          <span className="savings">{calculateSavings()}</span>
        </div>
        
        <div className="campaign-details">
          <p>{campaign.description}</p>
          <span className="valid-until">
            Valid until {new Date(campaign.validTo).toLocaleDateString()}
          </span>
        </div>
      </div>
    </div>
  );
};
```

### Campaign Filtering [#campaign-filtering]
```typescript
const filterActiveCampaigns = (properties) => {
  const now = new Date();
  
  return properties.filter(item => {
    const validFrom = new Date(item.campaign.validFrom);
    const validTo = new Date(item.campaign.validTo);
    
    return now >= validFrom && now <= validTo;
  });
};

const sortByBestValue = (properties) => {
  return properties.sort((a, b) => {
    // Sort by highest earning rate first
    return b.bonusEarningRate - a.bonusEarningRate;
  });
};
```

### Earning Calculator [#earning-calculator]
```typescript
const calculateEarnings = (property, stayDetails) => {
  const { nightlyCost } = property.property;
  const { campaign, baseEarningRate, bonusEarningRate } = property;
  const { nights, totalSpend } = stayDetails;
  
  // Base earning calculation
  const basePoints = Math.floor((totalSpend || nightlyCost * nights) * baseEarningRate / 100);
  
  // Bonus calculation
  let bonusPoints = 0;
  
  if (campaign.bonusMultiplier) {
    bonusPoints = Math.floor(basePoints * (campaign.bonusMultiplier - 1));
  }
  
  if (campaign.bonusAmount) {
    bonusPoints += campaign.bonusAmount * nights;
  }
  
  return {
    basePoints,
    bonusPoints,
    totalPoints: basePoints + bonusPoints,
    savings: bonusPoints
  };
};
```

## Campaign Management [#campaign-management]

### Validity Checking [#validity-checking]
- **Date Validation**: Campaigns automatically filtered by valid date range
- **Terms Compliance**: Campaign terms displayed to users
- **Availability**: Real-time validation against booking dates
- **Eligibility**: Member tier and booking requirements checked

### Dynamic Updates [#dynamic-updates]
- **Real-time**: Campaign status updated in real-time
- **Inventory**: Campaign availability tracked by property
- **Rate Changes**: Earning rates updated when campaigns change
- **Notifications**: Members notified of new bonus opportunities

## Related Endpoints [#related-endpoints]

- [Get Featured Content](/api-reference/members/me/discover/get-featured) - Main discover screen content
- [Get Signature Stays](/api-reference/members/me/discover/get-signature-stays) - Premium curated properties
- [Get Inspiring Stays](/api-reference/members/me/discover/get-inspiring-stays) - Themed property collections
- [Get Wallet Activity](/api-reference/members/wallet/get-activity) - Track earned bonus points
