Vacation Tours API (v1)
Structured multi-day vacation packages with day-by-day itineraries. Visibility is controlled per tour (all_tenants, owner_tenant_only, selected_tenants). The storefront and API only return published tours that are visible for the resolved tenant.
Tenant resolution
Use the same rules as GET /api/v1/tenant/capabilities: tenant_id, tenant (id or slug), X-Tenant header, authenticated user’s tenant, or host-based lookup.
enabled_products must include tours for the tenant or catalog responses may be empty / capabilities will show vacation_tours.enabled: false.
Payments (dedicated tenant gateway mapping)
Tour checkout uses only tenant_payment_gateways rows whose event_type is vacation_tour. That is a separate mapping from hotels (hotel_booking), activities (activity), cars, flights, and POS: there is no fallback—if no vacation_tour row is configured, tour payment methods will not appear until you add one.
In Tenant Admin → Payment Gateways (or Super Admin with a tenant selected), add one or more gateways under Vacation tour so tours can run with their own credentials, defaults, and limits even when other products use different providers.
- List gateways for the browser:
GET /api/payment-gateways/available?event_type=vacation_tour&tenant_id={id}&amount={tour_base_price}¤cy={ISO}(same endpoint as other products;amount/currencyoptional filters). - Booking with payment (optional): include
payment_gateway_id(atenant_payment_gateways.idfor that tenant andevent_type = vacation_tour) andpayment_data(same shape as activity booking, e.g. Stripepayment_method_idafter client tokenization). Successful charges create apayment_transactionsrow withevent_type=vacation_tourandreference_type=vacation_tour_booking.
List tours
GET /api/v1/vacation-tours
| Query | Description |
|---|---|
q |
Search in title, destination, summary |
destination |
Substring match on tour destination or any itinerary day overnight_location |
min_days, max_days |
Duration filter |
max_price |
Maximum base_price |
per_page |
1–50 (default 20) |
Tour locations (search UI)
GET /api/v1/vacation-tours/locations
Returns sorted, case-insensitively unique labels for destination and itinerary overnight_location across all published tours visible to the resolved tenant (same rules as the list endpoint). Intended for storefront datalists and filters—no separate hard-coded list.
Response shape: { "data": { "locations": ["…"], "count": N } }.
Tour detail
GET /api/v1/vacation-tours/{slug}
Returns itinerary days and long description when the tour is visible to the tenant.
Create booking / quote request
POST /api/v1/vacation-tours/{slug}/bookings
Throttled (30/min per IP). JSON or form body:
| Field | Rules |
|---|---|
booking_kind |
request (quote) or book (booking intent) |
lead_name |
required, max 120 |
lead_email |
required, email |
lead_phone |
optional |
requested_start_date |
optional, date, not in the past |
adults |
required, 1–50 |
children |
optional, 0–50 |
special_requests |
optional, max 5000 |
Response 201 with reference_code (e.g. VT-…). Authenticated Sanctum users get user_id stamped when present.
Admin workflows (status pending → confirmed / declined / etc.) are handled in Super Admin and Tenant Admin under Vacation Tour Bookings.