# Reservation Preview
> Source: /api-reference/members/reservations/preview
> Authenticated reservation preview with claim status
> Endpoint: GET /members/me/reservations/:reservationId/preview

## Overview [#overview]

Retrieve a reservation preview for the authenticated member, including full `claimDetails` — who has claimed it, and whether the current member owns the claim. Powers the authenticated leg of the points claim flow.

For unauthenticated landing pages, use [GET /public/reservations/:externalId/preview](/api-reference/public/reservations/get-reservation-preview) instead.

## Authentication [#authentication]

Requires a valid Clerk JWT token.

## Path Parameters [#path-parameters]

<ParamField path="reservationId" type="string" required>
  Reservation external ID (from a claim email link or lookup endpoint)
</ParamField>

## Response [#response]

<ResponseField name="externalId" type="string" required>
  Reservation external ID
</ResponseField>

<ResponseField name="totalAwardedPoints" type="number" required>
  Points that would be awarded for claiming this reservation
</ResponseField>

<ResponseField name="guest" type="object" required>
  `{ firstName: string }`
</ResponseField>

<ResponseField name="property" type="object" required>
  `{ name, allianceMember, media: [{ url, thumbnailUrl }], address: { city, state, latitude, longitude }, brand: { name, logo } }`
</ResponseField>

<ResponseField name="claimDetails" type="object" required>
  <Expandable title="properties">
    <ResponseField name="isClaimed" type="boolean">
      Whether this reservation has been claimed by any member
    </ResponseField>
    <ResponseField name="isOwnedByCurrentMember" type="boolean">
      Whether the authenticated member owns the claim
    </ResponseField>
    <ResponseField name="otherMember" type="object | null">
      Present when claimed by a different member — contains masked contact info
      <Expandable title="properties">
        <ResponseField name="maskedEmail" type="string | null">
          e.g. `j***@example.com`
        </ResponseField>
        <ResponseField name="maskedPhone" type="string | null">
          e.g. `+1212***0100`
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>

```bash cURL
curl "https://api.journey.com/members/me/reservations/RES_01J5XYZ/preview" \
  -H "Authorization: Bearer YOUR_CLERK_JWT"
```

```typescript TypeScript
const preview = await fetch(
  'https://api.journey.com/members/me/reservations/RES_01J5XYZ/preview',
  { headers: { 'Authorization': `Bearer ${clerkToken}` } }
).then(r => r.json());

if (!preview.claimDetails.isClaimed) {
  console.log(`Unclaimed — ${preview.totalAwardedPoints} points available`);
} else if (preview.claimDetails.isOwnedByCurrentMember) {
  console.log('You already claimed this reservation');
} else {
  const other = preview.claimDetails.otherMember;
  console.log(`Claimed by: ${other?.maskedEmail ?? other?.maskedPhone}`);
}
```

</RequestExample>

<ResponseExample>

```json 200 Response - Unclaimed
{
  "externalId": "RES_01J5XYZ",
  "totalAwardedPoints": 2500,
  "guest": { "firstName": "Sarah" },
  "property": {
    "name": "The Surf Club",
    "allianceMember": true,
    "media": [{ "url": "https://cdn.../hero.jpg", "thumbnailUrl": "https://cdn.../thumb.jpg" }],
    "address": { "city": "Surfside", "state": "FL", "latitude": 25.87, "longitude": -80.12 },
    "brand": { "name": "Four Seasons", "logo": {} }
  },
  "claimDetails": {
    "isClaimed": false,
    "isOwnedByCurrentMember": false,
    "otherMember": null
  }
}
```

```json 200 Response - Claimed by Other
{
  "externalId": "RES_01J5XYZ",
  "totalAwardedPoints": 2500,
  "guest": { "firstName": "Sarah" },
  "property": { "...": "..." },
  "claimDetails": {
    "isClaimed": true,
    "isOwnedByCurrentMember": false,
    "otherMember": {
      "maskedEmail": "s***@example.com",
      "maskedPhone": null
    }
  }
}
```

</ResponseExample>

## Claim Flow [#claim-flow]

1. `GET /members/me/reservations/:id/preview` — check claim status
2. If unclaimed: `POST /members/me/reservations/lookup-claim` — claim it
3. If claimed by someone else: `POST /members/me/reservations/:id/claim/verify` — verify identity to merge accounts

## Bruno [#bruno]

`bruno/Members (Surface)/Reservations/Preview.bru`
