Add Verified Contact
Sync verified contact and link reservations
/members/me/auth/verified-contactOverview
Call this endpoint after verifying a new email/phone via Clerk OTP to:
- Add the contact to verified contacts (if unique)
- Search for unlinked reservations matching this contact
- Link matching reservations with appropriate financial handling
- Return detailed results for client display
Authentication
Requires a valid Clerk JWT token in the Authorization header.
Request Body
typebodystringrequiredContact type: "phone" or "email"
valuebodystringrequiredPhone number (E.164 format) or email address
claimReservationIdbodynumberOptional specific reservation ID to claim during this verification
Request
curl -X POST "http://localhost:3000/v1/members/me/auth/verified-contact" \
-H "Authorization: Bearer YOUR_CLERK_JWT" \
-H "Content-Type: application/json" \
-d '{
"type": "email",
"value": "john.doe@example.com"
}'Response
contactobjectrequiredContact sync result
properties
statusstringrequiredContact status: "added", "exists", or "rejected"
reasonstringAdditional context for the status
reservationsLinkednumberrequiredNumber of reservations successfully linked
totalCreditIssuednumberrequiredTotal CREDIT points issued for future checkouts
totalValidAwardednumberrequiredTotal VALID points awarded from escrow conversion
linkedReservationsarrayrequiredDetails of each linked reservation
array items
reservationIdnumberrequiredReservation ID
confirmationCodestringrequiredReservation confirmation code
propertyNamestringrequiredProperty name
checkInDatestringrequiredCheck-in date
checkOutDatestringrequiredCheck-out date
financialOutcomestringrequiredFinancial result: "PENDING_FUTURE", "WITHIN_CLAIM_WINDOW", "CLAIM_WINDOW_EXPIRED"
pointsAwardednumberrequiredPoints awarded for this reservation
awardContextstringrequiredAward context: "UNCLAIMED", "MEMBER_ENROLLED", "MEMBER_INELIGIBLE", "MEMBER_DIRECT", "MEMBER_INDIRECT"
Response
{
"contact": {
"status": "added",
"reason": "Contact successfully verified and added"
},
"reservationsLinked": 2,
"totalCreditIssued": 1500,
"totalValidAwarded": 2500,
"linkedReservations": [
{
"reservationId": 12345,
"confirmationCode": "ABC123",
"propertyName": "Luxury Resort & Spa",
"checkInDate": "2024-05-15",
"checkOutDate": "2024-05-18",
"financialOutcome": "PENDING_FUTURE",
"pointsAwarded": 1500,
"awardContext": "MEMBER_ENROLLED"
},
{
"reservationId": 12346,
"confirmationCode": "XYZ789",
"propertyName": "Downtown Hotel",
"checkInDate": "2024-03-10",
"checkOutDate": "2024-03-12",
"financialOutcome": "WITHIN_CLAIM_WINDOW",
"pointsAwarded": 2500,
"awardContext": "MEMBER_ENROLLED"
}
]
}Financial Outcomes
Different financial outcomes based on reservation timing:
PENDING_FUTURE
- When: Checkout date is in the future
- Action: Issues CREDIT points for immediate spending
- Points: Available immediately in member wallet
WITHIN_CLAIM_WINDOW
- When: Recently checked out (within claim window)
- Action: Converts escrow to VALID points
- Points: Added to lifetime/tier-eligible totals
CLAIM_WINDOW_EXPIRED
- When: Old checkout beyond claim window
- Action: Link for data only, no points awarded
- Points: 0 (window missed)
Award Contexts
Different scenarios based on member status at booking time:
UNCLAIMED
- When: No member was linked at booking time
- Award: 1x points from escrow holding tank
MEMBER_ENROLLED
- When: First-time linking for new member
- Award: One-time 1x award from Journey funding wallet
MEMBER_INELIGIBLE
- When: Late-joiner but signup bonus already used
- Award: 0x points (escrow voided)
MEMBER_DIRECT
- When: Member existed before booking, direct channel
- Award: 5x points multiplier
MEMBER_INDIRECT
- When: Member existed before booking, non-direct channel
- Award: 0x points (escrow voided)
Related Endpoints
- Validate Auth - Provision member account
- Get OTP Status - Check SMS delivery