# Get Property Rates
> Source: /api-reference/public/rates/get-property-rates
> Search available property rates with standard public pricing
> Endpoint: POST /public/reservations/rates

## Overview [#overview]

Returns available property rates with standard public pricing. This endpoint searches for hotel rates based on check-in/check-out dates, guest count, and optionally filters by specific room IDs.

## Authentication [#authentication]

No authentication required. This is a public endpoint.

## Request Body [#request-body]

<ParamField body="strapiPropertyId" type="string" required>
  Strapi property Document ID
</ParamField>

<ParamField body="checkIn" type="string" required>
  Check-in date (ISO format: YYYY-MM-DD). Cannot be in the past.
</ParamField>

<ParamField body="checkOut" type="string" required>
  Check-out date (ISO format: YYYY-MM-DD). Must be at least 1 day after check-in.
</ParamField>

<ParamField body="adults" type="number" required>
  Number of adults (minimum: 1, maximum: 20)
</ParamField>

<ParamField body="children" type="number">
  Number of children (minimum: 0, maximum: 10)
</ParamField>

<ParamField body="strapiRoomIds" type="string[]">
  Array of Strapi room IDs (documentId or id) to filter rates. If provided, only rates for these rooms will be returned.
</ParamField>

<RequestExample>

```bash cURL
curl -X POST "https://api.journey.com/v1/public/reservations/rates" \
  -H "Content-Type: application/json" \
  -d '{
    "strapiPropertyId": "fkihstwpqlezcm1ogi31yu8f",
    "checkIn": "2026-06-01",
    "checkOut": "2026-06-03",
    "adults": 2,
    "children": 0,
    "strapiRoomIds": ["k87cr02ph4s17msgcndg3yxz", "vqthp53n6303puuzhlgezob8"]
  }'
```

```typescript TypeScript
const getPropertyRates = async (rateRequest) => {
  const response = await fetch('https://api.journey.com/v1/public/reservations/rates', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      strapiPropertyId: 'fkihstwpqlezcm1ogi31yu8f',
      checkIn: '2026-06-01',
      checkOut: '2026-06-03',
      adults: 2,
      children: 0,
      strapiRoomIds: ['k87cr02ph4s17msgcndg3yxz', 'vqthp53n6303puuzhlgezob8']
    })
  });
  
  return response.json();
};
```

```javascript JavaScript
const getPropertyRates = async (rateRequest) => {
  const response = await fetch('https://api.journey.com/v1/public/reservations/rates', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      strapiPropertyId: 'fkihstwpqlezcm1ogi31yu8f',
      checkIn: '2026-06-01',
      checkOut: '2026-06-03',
      adults: 2,
      children: 0,
      strapiRoomIds: ['k87cr02ph4s17msgcndg3yxz', 'vqthp53n6303puuzhlgezob8']
    })
  });
  
  return response.json();
};
```

</RequestExample>

## Response [#response]

Returns property rates for the specified dates and criteria.

<ResponseField name="rates" type="array" required>
  Array of available room rates
  
  <Expandable title="array items">
    <ResponseField name="roomId" type="string" required>
      Room identifier
    </ResponseField>
    
    <ResponseField name="roomName" type="string" required>
      Display name for the room type
    </ResponseField>
    
    <ResponseField name="roomDescription" type="string">
      Detailed room description
    </ResponseField>
    
    <ResponseField name="maxOccupancy" type="number" required>
      Maximum number of guests allowed
    </ResponseField>
    
    <ResponseField name="dailyRates" type="array" required>
      Array of daily rate information
      
      <Expandable title="daily rate items">
        <ResponseField name="date" type="string" required>
          Date for this rate (YYYY-MM-DD)
        </ResponseField>
        
        <ResponseField name="rate" type="number" required>
          Nightly rate in cents (USD)
        </ResponseField>
        
        <ResponseField name="available" type="boolean" required>
          Whether this date is available for booking
        </ResponseField>
        
        <ResponseField name="restrictions" type="object">
          Stay restrictions for this date
          
          <Expandable title="restrictions object">
            <ResponseField name="minNights" type="number">
              Minimum number of nights required
            </ResponseField>
            
            <ResponseField name="maxNights" type="number">
              Maximum number of nights allowed
            </ResponseField>
            
            <ResponseField name="closedForArrival" type="boolean">
              Whether arrivals are closed for this date
            </ResponseField>
            
            <ResponseField name="closedForDeparture" type="boolean">
              Whether departures are closed for this date
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>
    
    <ResponseField name="totalCost" type="number" required>
      Total cost for the entire stay in cents (USD)
    </ResponseField>
    
    <ResponseField name="averageNightlyRate" type="number" required>
      Average nightly rate in cents (USD)
    </ResponseField>
    
    <ResponseField name="amenities" type="string[]">
      List of room amenities
    </ResponseField>
    
    <ResponseField name="images" type="array">
      Room images
      
      <Expandable title="image items">
        <ResponseField name="url" type="string" required>
          Image URL
        </ResponseField>
        
        <ResponseField name="thumbnailUrl" type="string">
          Thumbnail image URL
        </ResponseField>
        
        <ResponseField name="alt" type="string">
          Alt text for the image
        </ResponseField>
        
        <ResponseField name="type" type="string">
          Image type (hero, gallery, floor_plan)
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="propertyInfo" type="object">
  Basic property information
  
  <Expandable title="property info">
    <ResponseField name="id" type="string" required>
      Property document ID
    </ResponseField>
    
    <ResponseField name="name" type="string" required>
      Property name
    </ResponseField>
    
    <ResponseField name="address" type="object">
      Property address information
      
      <Expandable title="address">
        <ResponseField name="street" type="string">
          Street address
        </ResponseField>
        
        <ResponseField name="city" type="string">
          City name
        </ResponseField>
        
        <ResponseField name="state" type="string">
          State or province
        </ResponseField>
        
        <ResponseField name="country" type="string">
          Country name
        </ResponseField>
        
        <ResponseField name="postalCode" type="string">
          Postal/ZIP code
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="searchCriteria" type="object" required>
  Echo of the search parameters
  
  <Expandable title="search criteria">
    <ResponseField name="checkIn" type="string" required>
      Check-in date used for search
    </ResponseField>
    
    <ResponseField name="checkOut" type="string" required>
      Check-out date used for search
    </ResponseField>
    
    <ResponseField name="adults" type="number" required>
      Number of adults
    </ResponseField>
    
    <ResponseField name="children" type="number">
      Number of children
    </ResponseField>
    
    <ResponseField name="nights" type="number" required>
      Number of nights calculated
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseExample>

```json 200 Response - Available Rates
{
  "rates": [
    {
      "roomId": "k87cr02ph4s17msgcndg3yxz",
      "roomName": "Ocean View Suite",
      "roomDescription": "Spacious suite with panoramic ocean views, private balcony, and premium amenities",
      "maxOccupancy": 4,
      "dailyRates": [
        {
          "date": "2026-06-01",
          "rate": 45000,
          "available": true,
          "restrictions": {
            "minNights": 2,
            "maxNights": 14,
            "closedForArrival": false,
            "closedForDeparture": false
          }
        },
        {
          "date": "2026-06-02",
          "rate": 45000,
          "available": true,
          "restrictions": {
            "minNights": 2,
            "maxNights": 14,
            "closedForArrival": false,
            "closedForDeparture": false
          }
        }
      ],
      "totalCost": 90000,
      "averageNightlyRate": 45000,
      "amenities": [
        "Ocean View",
        "Private Balcony",
        "King Bed",
        "Mini Fridge",
        "Coffee Maker",
        "High-Speed WiFi"
      ],
      "images": [
        {
          "url": "https://cdn.journey.com/rooms/ocean-suite-hero.jpg",
          "thumbnailUrl": "https://cdn.journey.com/rooms/ocean-suite-hero-thumb.jpg",
          "alt": "Ocean View Suite with balcony",
          "type": "hero"
        },
        {
          "url": "https://cdn.journey.com/rooms/ocean-suite-bathroom.jpg",
          "thumbnailUrl": "https://cdn.journey.com/rooms/ocean-suite-bathroom-thumb.jpg",
          "alt": "Suite bathroom with marble finishes",
          "type": "gallery"
        }
      ]
    },
    {
      "roomId": "vqthp53n6303puuzhlgezob8",
      "roomName": "Standard King Room",
      "roomDescription": "Comfortable king room with modern amenities and city views",
      "maxOccupancy": 2,
      "dailyRates": [
        {
          "date": "2026-06-01",
          "rate": 25000,
          "available": true,
          "restrictions": {
            "minNights": 1,
            "maxNights": 14,
            "closedForArrival": false,
            "closedForDeparture": false
          }
        },
        {
          "date": "2026-06-02",
          "rate": 25000,
          "available": true,
          "restrictions": {
            "minNights": 1,
            "maxNights": 14,
            "closedForArrival": false,
            "closedForDeparture": false
          }
        }
      ],
      "totalCost": 50000,
      "averageNightlyRate": 25000,
      "amenities": [
        "City View",
        "King Bed",
        "Work Desk",
        "High-Speed WiFi",
        "Coffee Maker"
      ],
      "images": [
        {
          "url": "https://cdn.journey.com/rooms/standard-king-hero.jpg",
          "thumbnailUrl": "https://cdn.journey.com/rooms/standard-king-hero-thumb.jpg",
          "alt": "Standard King Room with city view",
          "type": "hero"
        }
      ]
    }
  ],
  "propertyInfo": {
    "id": "fkihstwpqlezcm1ogi31yu8f",
    "name": "Journey Beach Resort",
    "address": {
      "street": "123 Ocean Drive",
      "city": "Miami Beach",
      "state": "Florida",
      "country": "United States",
      "postalCode": "33139"
    }
  },
  "searchCriteria": {
    "checkIn": "2026-06-01",
    "checkOut": "2026-06-03",
    "adults": 2,
    "children": 0,
    "nights": 2
  }
}
```

```json 400 Error - Validation Error
{
  "statusCode": 400,
  "message": [
    "checkIn must be a valid date format (YYYY-MM-DD)",
    "adults must be between 1 and 20"
  ],
  "error": "Bad Request"
}
```

```json 404 Error - Property Not Found
{
  "statusCode": 404,
  "message": "Property not found",
  "error": "Not Found"
}
```

</ResponseExample>

## Use Cases [#use-cases]

### Rate Comparison [#rate-comparison]
```typescript
const compareRates = async (propertyId, dates, guests) => {
  const rates = await getPropertyRates({
    strapiPropertyId: propertyId,
    checkIn: dates.checkIn,
    checkOut: dates.checkOut,
    adults: guests.adults,
    children: guests.children
  });
  
  // Sort by total cost
  const sortedRates = rates.rates.sort((a, b) => a.totalCost - b.totalCost);
  
  return sortedRates.map(rate => ({
    roomName: rate.roomName,
    totalCost: rate.totalCost / 100, // Convert to dollars
    averageNightly: rate.averageNightlyRate / 100,
    maxOccupancy: rate.maxOccupancy,
    savings: sortedRates[0].totalCost === rate.totalCost ? 0 : 
            (rate.totalCost - sortedRates[0].totalCost) / 100
  }));
};
```

### Availability Checking [#availability-checking]
```typescript
const checkAvailability = (rates) => {
  return rates.rates.map(rate => {
    const unavailableDates = rate.dailyRates
      .filter(day => !day.available)
      .map(day => day.date);
    
    const hasRestrictedDates = rate.dailyRates
      .some(day => day.restrictions?.closedForArrival || day.restrictions?.closedForDeparture);
    
    return {
      roomName: rate.roomName,
      isFullyAvailable: unavailableDates.length === 0,
      unavailableDates,
      hasRestrictions: hasRestrictedDates,
      totalCost: rate.totalCost
    };
  }).filter(rate => rate.isFullyAvailable);
};
```

### Rate Calendar View [#rate-calendar-view]
```typescript
const formatRateCalendar = (rates) => {
  const calendar = {};
  
  rates.rates.forEach(rate => {
    rate.dailyRates.forEach(day => {
      if (!calendar[day.date]) {
        calendar[day.date] = [];
      }
      
      calendar[day.date].push({
        roomName: rate.roomName,
        roomId: rate.roomId,
        rate: day.rate / 100, // Convert to dollars
        available: day.available,
        restrictions: day.restrictions
      });
    });
  });
  
  return calendar;
};
```

## Validation [#validation]

### Date Validation [#date-validation]
- Check-in date must be in YYYY-MM-DD format
- Check-in date cannot be in the past
- Check-out date must be at least 1 day after check-in
- Maximum stay length is typically 30 days

### Guest Count Validation [#guest-count-validation]
- Adults: minimum 1, maximum 20
- Children: minimum 0, maximum 10
- Total guests should not exceed room capacity

### Room ID Validation [#room-id-validation]
- Room IDs must be valid Strapi document IDs
- Invalid room IDs will be filtered out silently
- If no valid room IDs provided, all rooms are returned

## Rate Information [#rate-information]

### Pricing [#pricing]
- All rates returned in USD cents (multiply by 0.01 for dollars)
- Rates include base room cost only
- Taxes and fees calculated separately at booking
- Subject to availability and rate restrictions

### Rate Types [#rate-types]
- **Standard Public Rates**: Available to all users without authentication
- **Member Rates**: Require authentication (see member endpoints)
- **Promotional Rates**: May have specific terms and conditions

## Related Endpoints [#related-endpoints]

- [Get Property Availability](/api-reference/public/availabilities/get-property-availability) - Check room availability
- [Property Search](/api-reference/public/properties/search) - Search properties with pricing
- [Property Details](/api-reference/public/properties/get-property-details) - Get complete property information
