build_booking_url
ChatGPTInternal continuation step: generate the server-built booking URL for an offer the user has explicitly chosen to book. Only call after the user has selected a specific offer and asked to proceed to booking or checkout; the widget surfaces the link via openExternal on explicit user click. Requires searchId, offerId, and sourceHost. Do not call this to search, compare, or browse cars (use search_car_rentals for that), and never generate a booking link before the user has picked an offer.
get_car_rental_details
ChatGPTUse this when the user has already seen rental-car offers and wants full details on a specific one — rental conditions, deposit, insurance/coverage, mileage policy, cancellation terms, fuel policy, or a same-class supplier comparison (e.g. 'what's the deposit on that one?', 'is insurance included?', 'show me details'). Requires searchId and offerId from a prior search_car_rentals result. Data-only: chain render_car_details with the same searchId+offerId to display the detail widget. Does not search new inventory and does not book.
get_rental_locations
ChatGPTUse this FIRST to resolve a free-text place — city, airport, train station, or hotel — into a specific pickup or drop-off location id before searching for cars (e.g. 'Barcelona', 'Lisbon airport', 'near Dubai Marina', 'alquiler en Málaga'). Returns matching locations with type, country, and coordinates so search_car_rentals uses the correct location. Use this whenever the pickup place is ambiguous or could be either a city or an airport. Data-only: it does not render a widget and does not book.
list_car_rentals
ChatGPTInternal pagination step for the rental-car widget: returns a window of the cached search pool for a prior search_car_rentals result, applying the widget's current filters and sort over the whole pool. Requires searchId; accepts filters, sort, offset, and limit. Data-only — does not render a widget and does not search new inventory. Not selected from user intent; the widget calls it on scroll or filter.
refine_car_rentals
ChatGPTUse this — NOT search_car_rentals — when rental-car results are already displayed in this conversation and the user narrows or re-orders the same trip: 'only SUVs', 'automatic only', 'under 300', 'cheapest first', 'with free cancellation'. Same pickup/drop-off and dates as the shown search, plus the new filters or sort. Returns data only and renders NO widget (re-rendering the widget is not supported by the host); summarize the top matching offers in text and remind the user they can also apply filters with the controls on the results card above. For a genuinely new trip (different location or dates) use search_car_rentals.
render_car_details
ChatGPTInternal render step: display the car-details widget for an offer already fetched via get_car_rental_details, using the same searchId and offerId. Not a data tool — call get_car_rental_details first.
render_error_state
ChatGPTInternal render step: display the error-state widget after a recoverable failure. Provide an error code, a user-facing message, and an optional retry hint. Not selected from user intent.
search_car_rentals
ChatGPTUse this when the user wants to rent or hire a car, find a rental car / car hire, or compare car-rental prices to pick up at an airport, city, train station, or hotel for a date range. Triggers include phrasings like 'rent a car in Barcelona next weekend', 'cheap automatic SUV at Lisbon airport', 'I need a vehicle for a week in Italy', 'car for a family of 5 with luggage space', 'cheapest car rental with free cancellation', plus non-English equivalents: 'alquiler de coches' (ES), 'location de voiture' (FR), 'Mietwagen' (DE), 'noleggio auto' (IT). Searches live rental cars across major agencies and local suppliers (not peer-to-peer host-owned cars) and returns multiple comparable offers with daily and total price, supplier rating, transmission, seats, bags, category (economy/compact/SUV/van/premium), fuel policy, and coverage/cancellation badges, then renders the comparison widget. Honors optional filters (transmission, category, min seats, min bags, max price, supplier, trust badges) and sort (recommended, price_asc, rating_desc) — include them right away when the user's request carries criteria ('cheap automatic SUV'). Call this at most ONCE per trip: if results for this trip are already displayed and the user merely narrows or re-orders them ('only SUVs', 'under 300', 'cheapest first'), call refine_car_rentals instead — a repeated widget render is not supported by the host and shows an empty card. Resolve an ambiguous pickup place with get_rental_locations first. Not for flights, hotels, taxis/ride-hailing, or buying a car.