# Get Member Details
> Source: /api-reference/members/me/get-me
> Get comprehensive member data including profile, wallet, loyalty, and contacts
> Endpoint: GET /members/me

## Overview [#overview]

Returns comprehensive member data in a single response, including:
- Member core data (names, status, member code)
- Profile preferences (if set)
- Verified contacts (phone numbers, emails)
- Wallet balances (spendable points, tier-eligible points)
- Loyalty status (tier level, progression, expiration)

This is the primary endpoint for fetching member data on app launch or profile pages.

## Authentication [#authentication]

Requires a valid Clerk JWT token in the Authorization header.

## Query Parameters [#query-parameters]

<ParamField query="fields" type="string">
  Comma-separated list of fields to include. By default, all fields are returned.
  
  Use `-fieldName` to exclude specific fields.
  
  Examples:
  - `?fields=member,wallet` - Only return member and wallet data
  - `?fields=-profile,-contacts` - Return everything except profile and contacts
</ParamField>

<RequestExample>

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

```typescript TypeScript
const response = await fetch('http://localhost:3000/v1/members/me', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_CLERK_JWT'
  }
});

const memberData = await response.json();
```

```javascript Bruno
// From: /bruno/Members (Surface)/Me/Profile/Get Me.bru
GET {{host}}/members/me
Authorization: Bearer {{clerkJwt}}
```

</RequestExample>

## Response [#response]

<ResponseField name="member" type="object" required>
  Core member information
  
  <Expandable title="properties">
    <ResponseField name="externalId" type="string" required>
      External ID (matches Clerk user ID)
    </ResponseField>
    
    <ResponseField name="memberCode" type="string" required>
      Unique member code for display
    </ResponseField>
    
    <ResponseField name="legacyJourneyUserId" type="string | null" required>
      Legacy system user ID if migrated
    </ResponseField>
    
    <ResponseField name="displayName" type="string | null" required>
      Display name (computed from first/last or email)
    </ResponseField>
    
    <ResponseField name="firstName" type="string | null" required>
      First name from Clerk profile
    </ResponseField>
    
    <ResponseField name="lastName" type="string | null" required>
      Last name from Clerk profile
    </ResponseField>
    
    <ResponseField name="avatarUrl" type="string | null" required>
      Avatar image URL
    </ResponseField>
    
    <ResponseField name="status" type="string" required>
      Member status: "active", "suspended", etc.
    </ResponseField>
    
    <ResponseField name="enrolledAt" type="string" required>
      ISO 8601 enrollment timestamp
    </ResponseField>
    
    <ResponseField name="memberSince" type="string" required>
      Human-readable member since date
    </ResponseField>
    
    <ResponseField name="onboardingCompletedAt" type="string | null" required>
      ISO 8601 onboarding completion timestamp
    </ResponseField>
    
    <ResponseField name="createdAt" type="string" required>
      ISO 8601 creation timestamp
    </ResponseField>
    
    <ResponseField name="updatedAt" type="string" required>
      ISO 8601 last update timestamp
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="profile" type="object | null" required>
  Extended profile preferences (null if not set)
  
  <Expandable title="properties">
    <ResponseField name="dateOfBirth" type="string | null">
      Date of birth in YYYY-MM-DD format
    </ResponseField>
    
    <ResponseField name="gender" type="string | null">
      Gender identity
    </ResponseField>
    
    <ResponseField name="nationality" type="string | null">
      Nationality
    </ResponseField>
    
    <ResponseField name="timezone" type="string | null">
      IANA timezone
    </ResponseField>
    
    <ResponseField name="language" type="string | null">
      Preferred language code
    </ResponseField>
    
    <ResponseField name="bio" type="string | null">
      Member biography
    </ResponseField>
    
    <ResponseField name="socialLinks" type="object | null">
      Social media links
      
      <Expandable title="properties">
        <ResponseField name="linkedin" type="string">
          LinkedIn profile URL
        </ResponseField>
        <ResponseField name="instagram" type="string">
          Instagram handle
        </ResponseField>
        <ResponseField name="twitter" type="string">
          Twitter/X handle
        </ResponseField>
        <ResponseField name="facebook" type="string">
          Facebook profile
        </ResponseField>
      </Expandable>
    </ResponseField>
    
    <ResponseField name="travelPreferences" type="object | null">
      Travel preferences
      
      <Expandable title="properties">
        <ResponseField name="preferredAirlines" type="string[]">
          Preferred airline names
        </ResponseField>
        <ResponseField name="frequentFlyerPrograms" type="object[]">
          Frequent flyer details
        </ResponseField>
        <ResponseField name="seatPreference" type="string">
          Seat preference: window, aisle, middle
        </ResponseField>
        <ResponseField name="mealPreference" type="string">
          Meal preference
        </ResponseField>
        <ResponseField name="travelClass" type="string">
          Travel class preference
        </ResponseField>
        <ResponseField name="travelCompanions" type="string[]">
          Common travel companions
        </ResponseField>
        <ResponseField name="passportCountry" type="string">
          Passport country code
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="contacts" type="array" required>
  Verified contact information
  
  <Expandable title="array items">
    <ResponseField name="type" type="string" required>
      Contact type: "phone" or "email"
    </ResponseField>
    
    <ResponseField name="value" type="string" required>
      Phone number (E.164) or email address
    </ResponseField>
    
    <ResponseField name="isPrimary" type="boolean" required>
      Whether this is the primary contact
    </ResponseField>
    
    <ResponseField name="verifiedAt" type="string" required>
      ISO 8601 verification timestamp
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="wallet" type="object" required>
  Wallet balance summary
  
  <Expandable title="properties">
    <ResponseField name="spendablePoints" type="number" required>
      Total spendable points (validBalance + creditBalance)
    </ResponseField>
    
    <ResponseField name="validBalance" type="number" required>
      VALID asset balance (earned points)
    </ResponseField>
    
    <ResponseField name="creditBalance" type="number" required>
      CREDIT asset balance (promotional points)
    </ResponseField>
    
    <ResponseField name="tierEligiblePoints" type="number" required>
      Points earned this calendar year that count toward tier
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="loyalty" type="object" required>
  Loyalty tier and progression information
  
  <Expandable title="properties">
    <ResponseField name="tierLevel" type="number" required>
      Current tier level (1 = Traveler/base)
    </ResponseField>
    
    <ResponseField name="tierName" type="string" required>
      Current tier name
    </ResponseField>
    
    <ResponseField name="lifetimePoints" type="number" required>
      Total lifetime points earned
    </ResponseField>
    
    <ResponseField name="pointsToNextTier" type="number | null" required>
      Points needed to reach next tier (null if at max)
    </ResponseField>
    
    <ResponseField name="nextTierName" type="string | null" required>
      Name of next tier (null if at max)
    </ResponseField>
    
    <ResponseField name="earnYear" type="number | null" required>
      Year the current tier was earned (null for base tier)
    </ResponseField>
    
    <ResponseField name="currentYear" type="number" required>
      Current calendar year
    </ResponseField>
    
    <ResponseField name="currentYearPoints" type="number" required>
      Points earned in current calendar year
    </ResponseField>
    
    <ResponseField name="statusValidThrough" type="string | null" required>
      Human-readable expiration date (null for base tier)
    </ResponseField>
    
    <ResponseField name="pointsToMaintainTier" type="number" required>
      Points needed to re-qualify for current tier (0 if already re-qualified or base tier)
    </ResponseField>
    
    <ResponseField name="tiers" type="array" required>
      All tier definitions for progress rendering
      
      <Expandable title="array items">
        <ResponseField name="tierLevel" type="number" required>
          Tier level number
        </ResponseField>
        <ResponseField name="tierName" type="string" required>
          Tier name
        </ResponseField>
        <ResponseField name="minPoints" type="number" required>
          Minimum points required
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseExample>

```json 200 Response - Full Data
{
  "member": {
    "externalId": "user_2abc123def456",
    "memberCode": "JRN123456",
    "legacyJourneyUserId": null,
    "displayName": "John Doe",
    "firstName": "John",
    "lastName": "Doe",
    "avatarUrl": "https://example.com/avatar.jpg",
    "status": "active",
    "enrolledAt": "2023-01-15T10:30:00Z",
    "memberSince": "January 2023",
    "onboardingCompletedAt": "2023-01-16T14:22:00Z",
    "createdAt": "2023-01-15T10:30:00Z",
    "updatedAt": "2024-04-20T09:15:00Z"
  },
  "profile": {
    "dateOfBirth": "1990-01-15",
    "gender": "male",
    "nationality": "United States",
    "timezone": "America/Los_Angeles",
    "language": "en",
    "bio": "Frequent traveler and points enthusiast",
    "socialLinks": {
      "linkedin": "https://linkedin.com/in/johndoe",
      "instagram": "@johndoe"
    },
    "travelPreferences": {
      "preferredAirlines": ["United", "Delta"],
      "frequentFlyerPrograms": [
        {
          "airline": "United",
          "number": "UA123456789"
        }
      ],
      "seatPreference": "aisle",
      "mealPreference": "vegetarian",
      "travelClass": "business",
      "travelCompanions": ["Jane Doe"],
      "passportCountry": "US"
    }
  },
  "contacts": [
    {
      "type": "email",
      "value": "john.doe@example.com",
      "isPrimary": true,
      "verifiedAt": "2023-01-15T10:30:00Z"
    },
    {
      "type": "phone",
      "value": "+15551234567",
      "isPrimary": true,
      "verifiedAt": "2023-01-15T10:35:00Z"
    }
  ],
  "wallet": {
    "spendablePoints": 25000,
    "validBalance": 23000,
    "creditBalance": 2000,
    "tierEligiblePoints": 15000
  },
  "loyalty": {
    "tierLevel": 2,
    "tierName": "Explorer",
    "lifetimePoints": 75000,
    "pointsToNextTier": 25000,
    "nextTierName": "Voyager",
    "earnYear": 2023,
    "currentYear": 2024,
    "currentYearPoints": 15000,
    "statusValidThrough": "December 31, 2025",
    "pointsToMaintainTier": 5000,
    "tiers": [
      {
        "tierLevel": 1,
        "tierName": "Traveler",
        "minPoints": 0
      },
      {
        "tierLevel": 2,
        "tierName": "Explorer",
        "minPoints": 20000
      },
      {
        "tierLevel": 3,
        "tierName": "Voyager",
        "minPoints": 50000
      },
      {
        "tierLevel": 4,
        "tierName": "Pioneer",
        "minPoints": 100000
      }
    ]
  }
}
```

```json 200 Response - New Member (No Profile)
{
  "member": {
    "externalId": "user_2xyz789abc123",
    "memberCode": "JRN789012",
    "legacyJourneyUserId": null,
    "displayName": "jane@example.com",
    "firstName": null,
    "lastName": null,
    "avatarUrl": null,
    "status": "active",
    "enrolledAt": "2024-04-20T08:00:00Z",
    "memberSince": "April 2024",
    "onboardingCompletedAt": null,
    "createdAt": "2024-04-20T08:00:00Z",
    "updatedAt": "2024-04-20T08:00:00Z"
  },
  "profile": null,
  "contacts": [
    {
      "type": "email",
      "value": "jane@example.com",
      "isPrimary": true,
      "verifiedAt": "2024-04-20T08:00:00Z"
    }
  ],
  "wallet": {
    "spendablePoints": 0,
    "validBalance": 0,
    "creditBalance": 0,
    "tierEligiblePoints": 0
  },
  "loyalty": {
    "tierLevel": 1,
    "tierName": "Traveler",
    "lifetimePoints": 0,
    "pointsToNextTier": 20000,
    "nextTierName": "Explorer",
    "earnYear": null,
    "currentYear": 2024,
    "currentYearPoints": 0,
    "statusValidThrough": null,
    "pointsToMaintainTier": 0,
    "tiers": [
      {
        "tierLevel": 1,
        "tierName": "Traveler",
        "minPoints": 0
      },
      {
        "tierLevel": 2,
        "tierName": "Explorer",
        "minPoints": 20000
      },
      {
        "tierLevel": 3,
        "tierName": "Voyager",
        "minPoints": 50000
      },
      {
        "tierLevel": 4,
        "tierName": "Pioneer",
        "minPoints": 100000
      }
    ]
  }
}
```

</ResponseExample>

## Display State Logic [#display-state-logic]

The loyalty data provides information for 4 different display states on the client:

1. **Traveler (Base Tier)**: `tierLevel == 1`
2. **Earn Year**: `tierLevel > 1 && currentYear == earnYear`
3. **Status Year**: `tierLevel > 1 && currentYear == earnYear + 1`
4. **Fallback**: Treat as Traveler

### Progress Bar Logic [#progress-bar-logic]

- If `pointsToMaintainTier > 0`: Show `X / Y pts to keep {tierName}`
- If `pointsToMaintainTier == 0`: Show `X / Y pts toward {nextTierName}`
- If `nextTierName == null`: Max tier celebration state

## Related Endpoints [#related-endpoints]

- [Update Member](/api-reference/members/me/update-me) - Update member display name
- [Get Profile](/api-reference/members/me/profile/get-profile) - Get profile data only
- [Update Profile](/api-reference/members/me/profile/update-profile) - Update profile preferences
- [Get Wallet](/api-reference/members/wallet/get-wallet) - Get detailed wallet information
- [Validate Auth](/api-reference/members/auth/validate) - Provision member account
