# Validate Member
> Source: /api-reference/members/auth/validate
> Provision or retrieve member based on Clerk authentication
> Endpoint: POST /members/me/auth/validate

# Validate Member

Provision a new member or retrieve existing member based on Clerk authentication.

<Note>
  This endpoint must be called before any other member-specific operations.
</Note>

## Request [#request]

```typescript
POST /members/me/auth/validate
Authorization: Bearer <CLERK_JWT_TOKEN>
```

## Response [#response]

<ResponseField name="member" type="object">
  <Expandable title="properties">
    <ResponseField name="externalId" type="string">
      ULID identifier for the member
    </ResponseField>
    <ResponseField name="memberCode" type="string">
      6-character user-facing code
    </ResponseField>
    <ResponseField name="firstName" type="string">
      Member's first name from Clerk
    </ResponseField>
    <ResponseField name="lastName" type="string">
      Member's last name from Clerk
    </ResponseField>
    <ResponseField name="status" type="string">
      Member status: active, suspended, closed, merged
    </ResponseField>
    <ResponseField name="provisionedNow" type="boolean">
      True if member was just created
    </ResponseField>
  </Expandable>
</ResponseField>

## Example [#example]

```typescript
const response = await fetch('https://api.journey.com/members/me/auth/validate', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${clerkToken}`
  }
});

const data = await response.json();

if (data.member.provisionedNow) {
  console.log('New member created:', data.member.memberCode);
} else {
  console.log('Existing member:', data.member.memberCode);
}
```

## Bruno [#bruno]

`bruno/Members (Surface)/Auth/Validate.bru`

## Provisioning Flow [#provisioning-flow]

1. Extract Clerk user ID from JWT
2. Check for existing member by clerk_user_id
3. If not found, fetch Clerk user data
4. Check for existing member by verified contacts
5. Create new member if no match
6. Create wallet and verified contacts
7. Write metadata back to Clerk
8. Return member with provisionedNow flag
