Concierge Booking Request
Submit a concierge-assisted booking request for alliance properties
/members/me/reservations/concierge-requestOverview
Submit a booking request for an alliance property that requires concierge assistance. The API snapshots the property and stay context the member saw, alerts the Journey concierge team via Slack, and returns a booking external ID.
This endpoint is used for alliance/partner properties where real-time online booking is not available. The concierge team follows up to complete the reservation.
This is not a direct booking endpoint — it queues a concierge action. The member will be contacted to confirm the booking.
Authentication
Requires a valid Clerk JWT token.
Request Body
propertyExternalIdbodystringrequiredProperty's stable external identifier (Strapi/PMS external ID)
propertyNamebodystringrequiredProperty name as shown to the member at time of request (max 200 chars)
pageTemplateTypebodystringHotel or STR — whether this is a multi-room hotel or short-term rental. Used by the concierge to set expectations.
checkInbodystringrequiredCheck-in date in YYYY-MM-DD format (ISO 8601)
checkOutbodystringrequiredCheck-out date in YYYY-MM-DD format (ISO 8601)
adultsbodynumberrequiredNumber of adult guests (1–20)
childrenbodynumberrequiredNumber of children (0–20)
infantsbodynumberNumber of infants ages 0–2 (0–20). Forwarded to concierge for crib/setup requests. Defaults to 0.
petsbodynumberNumber of pets (0–20). Defaults to 0.
pointsRequiredbodynumberPoints total shown to the member. When provided, the server validates this matches the server-computed cost — a mismatch returns 400 POINTS_COST_MISMATCH so the client can refresh pricing before re-confirming.
cashTotalbodynumberCash total in USD shown to the member (≤ 2 decimal places). Same mismatch validation as pointsRequired — a 400 TOTAL_COST_MISMATCH tells the client to refresh pricing.
notesbodystringFree-text message from the member ("anything else we should know?"). Max 500 chars.
voiceNoteTranscriptbodystringDeepgram STT transcript of a spoken voice note. Max 5000 chars. Surfaced alongside booking details in the Slack alert.
voiceNoteDurationSecondsbodynumberDuration of the voice note in seconds (non-negative integer). Rendered as H:MM:SS in the Slack alert.
Response
statusstringrequiredAlways "received" on success
bookingExternalIdstringrequiredStable UUID for the created booking record. Use this for any subsequent member-facing lookups. The internal numeric ID is not exposed.
totalPointCostnumberrequiredServer-computed, validated points cost. Treat this as canonical — may differ from pointsRequired if pricing shifted.
totalCostUsdnumberrequiredServer-computed member cash total for the stay (USD). Canonical — may differ from cashTotal.
Request
curl -X POST "https://api.journey.com/members/me/reservations/concierge-request" \
-H "Authorization: Bearer YOUR_CLERK_JWT" \
-H "Content-Type: application/json" \
-d '{
"propertyExternalId": "prop_ext_abc123",
"propertyName": "The Surf Club",
"pageTemplateType": "Hotel",
"checkIn": "2026-07-10",
"checkOut": "2026-07-14",
"adults": 2,
"children": 0,
"pointsRequired": 12000,
"cashTotal": 450.00,
"notes": "Celebrating an anniversary — any room upgrades appreciated"
}'Response
{
"status": "received",
"bookingExternalId": "12345678-1234-5678-9012-123456789012",
"totalPointCost": 12000,
"totalCostUsd": 450.00
}Error Codes
| Code | Meaning |
|---|---|
POINTS_COST_MISMATCH | pointsRequired doesn't match server-computed cost — refresh pricing and retry |
TOTAL_COST_MISMATCH | cashTotal doesn't match server-computed total — refresh pricing and retry |