search_experiences
Search for tours and experiences on GetExperience.com. Works without an account or authentication. Returns list of matching experiences with id, title, price, location, duration, rating, payment type, photos, booking link.
BOOKING FLOW: search_experiences → get_experience_details → get_experience_schedule → add_to_checkout → create_order
EXAMPLES:
- "walking tour in Istanbul" → location: "Istanbul", categories: ["walking-tour"]
- "romantic dinner in Paris" → location: "Paris", categories: ["romantic", "food-and-drink"]
- "things to do in Bali" → location: "Bali"
- "водные виды спорта в Анталье" → location: "Antalya", categories: ["water-sports"], lang: "ru"
- "short private tour with free cancellation" → privateGroup: true, standardCancellation: true, durations: ["10-60"]
- "tours with partial payment in Turkey" → countryCode: "TR", paymentOptions: "part"
- "yacht party" → q: "yacht party"
- "tours for solo traveler" → peopleMin: 1
- "tours with transport included" → features: ["transport"]
All prices are in USD.
SEARCH TIPS:
- location: use English name for best results (e.g. "Istanbul" not "Стамбул"). Non-Latin input is supported but English is more reliable.
- If location is not found, you'll get a clear error — not random results. Try a broader location (country instead of city).
- "languages" filters tours by guide language (["es"] = tours in Spanish)
- "lang" sets the language of titles and descriptions in the response. ALWAYS pass it, matching the END USER's language (e.g. Russian query → lang: "ru"), even when location/other params are in English. Supported: en, es, de, ru, cn, fr, ar, pl, it, pt, nl, tr, cs, th, gr; falls back to "en" if unsupported.
- All filters can be combined: location + categories + paymentOptions + durations + standardCancellation etc.
- "q" is a free-text search across titles and descriptions — use it for specific queries that don't fit into categories.
━━━ PAGINATION ━━━
Results are paginated (default 25 per page). The response always shows the total count and which results you're viewing (e.g. "showing 1–25 of 80"). If there are more results, ALWAYS offer the user to see the next page. Use page parameter to fetch subsequent pages.
━━━ HOW TO PRESENT THESE RESULTS ━━━
DEFAULT PRESENTATION — a visual card gallery, not a plain text list. Every response
carries a [GXP_STRUCTURED] block; build the gallery from it whenever the surface can
render rich output, without waiting to be asked. Fall back to the markdown text above
only on text-only surfaces or when the user explicitly asks for a plain list.
Each card shows, in this order:
1. the photo — mainPhoto (photos[] holds more; keep the aspect ratio, no cropping of faces)
2. title
3. price (the "price" field is already formatted; priceCents is the raw value)
4. duration, and rating with review count when present
5. a link/button to the item's "link" field, labelled like "View" / "Подробнее" (localise to the user's language)
Lay the cards out in a responsive grid (2–3 per row on desktop, 1 on mobile), keep the
source order — it is relevance-ranked — and render every returned item, not a subset.
Photo URLs are public CDN links and may be used directly in <img> tags.
The cards REPLACE the plain list, not the surrounding information: still convey the
result count / pagination line above and offer the next page when more results exist.
Parse the block with:
const match = text.match(/\[GXP_STRUCTURED\]([\s\S]*?)\[\/GXP_STRUCTURED\]/);
const data = match ? JSON.parse(match[1].trim()) : null;
// → data.items[] — each item has: id, title, price, priceCents, location,
// durationMinutes, rating, reviewsCount, mainPhoto, photos[], paymentOptions, link
To get pure JSON without markdown: set responseFormat: "json"