cancel_booking
ChatGPTIrreversibly cancel a booking and calculate its policy-based refund. Cancellation cannot be undone. If payment was captured and the policy owes a non-zero refund, this call may also initiate refund processing. Returns the refund percentage and amount. Requires OAuth2 authentication.
check_availability
ChatGPTCheck real-time availability for a service on specific dates. Dates should be ISO format (YYYY-MM-DD). Returns availability status and pricing. Call get_services first to obtain the service_id. Follow with get_price_quote for dual-currency pricing before offering to book. `price_total_amount_minor is the total for the whole party, not a unit price. Quote that figure to the traveller and pass it back as quoted_total_minor on create_booking. price_breakdown.summary` says who is being charged what ("2 adults + 1 child"); state it, so a party of adults is never booked silently on a service with a child fare.
check_operator_replies
ChatGPTCheck for new operator replies in a conversation. Two distinct usage patterns: 1. Active wait (default): after `send_message_to_operator, call this with wait_seconds=60. The server holds each call open until an operator reply arrives or wait_seconds elapses. On each return, pass back since=<latest_reply_at from previous response> so the next call only surfaces *new* messages. Keep looping for up to ~5 minutes total; if still no reply, tell the tourist the operator will message back later and stop polling. 2. **Resumption peek**: when the tourist comes back later (new message in the same session, or a fresh session where they previously engaged this operator), call once with wait_seconds=0 *before* responding. Omit since so the response carries the most recent operator messages — typically the reply they missed while away. The response is bounded by limit (default 50, max 200) and always sorted chronologically. latest_reply_at is a cursor for the next active-wait call. When has_replies is true, surface the operator's messages to the user; if they want to respond, call send_message_to_operator again. When operator_active` is false, the operator has ended the chat — inform the user and resume normal AI assistance. Requires OAuth2.
create_booking
ChatGPTCreate a booking for a tourism service. IMPORTANT: This only RESERVES the booking — it is NOT confirmed until paid. Ask the traveller for their email and phone. Show the exact held email and phone values and ask for a correction if either is wrong; never guess or auto-apply a suggestion. If contact_verification_required is returned, ask for the code from the traveller's inbox and retry create_booking with the same details plus verification_code. Multi-stop trips: if the tourist is booking several operators in one trip (e.g. hotel + tour + activity), call create_booking for EACH leg FIRST. Do NOT call get_payment_link between bookings — that produces multiple separate links. Leave trip_token empty on the first leg; the response returns a 'trip_token' — pass that same token on every later leg of this trip. Once every leg is reserved, call get_payment_link ONCE with any one booking_reference; the server bundles exactly this trip's legs (by trip_token) into a single consolidated payment link. Never tell the user a booking is confirmed until payment is complete. The response transaction_mode is demo, sandbox, or live. If demo_notice is present, relay it exactly; do not describe a sandbox booking as live or chargeable. Requires OAuth2 authentication.
get_about_soley
ChatGPTWhat Sóley is — overview for any visitor or assistant. Returns a short canonical description of the Sóley platform so an AI assistant can answer "what is Sóley?" without needing to fetch the website or guess from training data. Safe to call from any context; carries no PII and no operator-specific data.
get_air_quality
ChatGPTGet air quality measurements for a location in Iceland. Returns PM2.5, PM10, SO2, NO2 levels, AQI index, and health advisory. Particularly relevant near volcanic eruption sites.
get_aurora_forecast
ChatGPTGet the aurora / northern lights forecast for Iceland. Returns cloud cover map, Kp index, and visibility predictions. Best viewing is typically September through March with clear skies.
get_avalanche_conditions
ChatGPTGet current avalanche danger conditions in Iceland from Vedur.is. Returns danger level (1-5), trend, snow conditions, and travel advisory per region. Critical for winter travel safety in mountainous areas.
get_booking_status
ChatGPTCheck the current status of a booking. If the booking is not yet marked paid, this call may poll the operator's payment processor and finalize and record a payment that has already settled. It never initiates a payment or cancellation. Returns the raw persisted status value (pending, awaiting_payment, paid, cancelled, expired), payment_status, and a convenience paid boolean. Legacy compatibility rows may still report awaiting_payment; present that to end users as traveler payment pending rather than as a new canonical state name. Polling cadence after presenting a payment link: 1. First poll — call with `wait_seconds=60. The server returns sub-second once payment lands, or after 60s if still pending. 2. **Active-wait loop** — if still paid: false, loop with another wait_seconds=60 call. Realistic payment latency is p95 ~3 min, p99 ~8 min; **cap the loop at ~10 iterations (10 min)** of active waiting. 3. **Pivot at 10 min** — tell the tourist "I'll let you know the moment payment confirms, feel free to ask me anything else in the meantime" and stop the active-wait loop. The payment window remains open for 30 minutes from link creation. 4. **On resumption** — if the tourist replies later, do a single non-blocking peek (wait_seconds=0`) before continuing. That surfaces a payment that landed while you weren't watching. 5. Absolute ceiling — at 30 minutes the payment window closes. A later status check reports expiry and tells the guest to book again. Do not require the user to say "I paid" — check proactively. Requires OAuth2 authentication.
get_bus_routes
ChatGPTFind Straeto bus routes serving an area or connecting two areas. Returns route number, name, and key_stops with coordinates for each route. key_stops contain name, latitude, longitude — render as a route line on a map. Use the route number in get_bus_schedule or get_live_buses.
get_bus_schedule
ChatGPTGet upcoming bus departures for a route, stop, or both. Returns the next departures from now (future only for today). Provide at least route_number or stop_id. Get stop_id from get_nearest_bus_stop, route_number from get_bus_routes.
get_earthquakes
ChatGPTGet recent earthquake activity in Iceland (last 48 hours). Returns list of earthquakes with magnitude, location, depth, and timestamp. Useful for monitoring volcanic activity and assessing travel safety.
get_exchange_rates
ChatGPTGet current ISK exchange rates from the Central Bank of Iceland. Returns buy/sell rates for ISK against major currencies. Updated daily on business days.
get_flights
ChatGPTGet current flight information for Keflavík International Airport. Returns flight number, airline, origin/destination, scheduled and estimated times, and current status (on time, delayed, landed, etc.).
get_fuel_prices
ChatGPTGet current fuel prices across Iceland by station. Returns prices per litre in ISK for each fuel station. When lat/lon provided: sorted by distance with distance_km field. Otherwise: sorted by cheapest bensin95 price first.
get_iceland_news
ChatGPTGet recent Iceland news headlines. Returns headline, summary, source, and publication date for each article.
get_live_buses
ChatGPTGet real-time Straeto bus positions across Reykjavik and Iceland. Each vehicle in vehicles contains: - latitude, longitude: WGS84 GPS position - route_number, route_id, bearing, speed_kmh Render vehicles as markers on a map using their coordinates. When a route is specified, route_polyline contains the route's geographic path as a list of {latitude, longitude} points — render as a line on the map. live_map_url is a clickable link to an interactive browser map. Always present both the map rendering and the live_map_url link. Tip: call get_bus_routes first to find the route number, then pass it here to get a focused map for that specific route.
get_nearest_bus_stop
ChatGPTFind the nearest Straeto public bus stops to a given location. Returns stop name, stop_id, distance in metres, and routes serving each stop. Each stop contains latitude and longitude — render all stops as markers on a map alongside the user's search location. Use the returned stop_id in get_bus_schedule.
get_payment_link
ChatGPTCreate or refresh a secure payment link for an existing booking. This call creates externally observable payment-provider and booking state, then returns payment_url, the operator's own payment page covering every reserved leg of the trip, together with included_bookings and the total. Where the payment card is displayed, it shows the legs and total, opens payment_url and marks the trip paid once payment settles; without the card, payment_url is the traveller's only way to pay. Sóley never processes payments directly — the operator is the merchant of record. If the consolidated link would span bookings started in different sessions on the same phone, the response is 'requires_confirmation' instead of a URL: relay the included bookings + total to the traveller, then re-call with confirm=true once approved. The response transaction_mode is demo, sandbox, or live. If demo_notice is present, relay it exactly; live responses intentionally omit demo_notice and use the normal payment copy.
get_price_quote
ChatGPTGet a dual-currency price quote for a service. Returns pricing in ISK and the tourist's likely currency based on language_code. Provider-backed lodging quotes include quote_basis (for example `1 bed) and unit_kind; name that sellable unit when presenting the quote. Call after check_availability confirms dates are open. Use the quote to inform the user before calling create_booking. If the quote lists traveller_questions, ask the traveller these before create_booking and send each answer in special_requests as its line says. total_amount_minor is the total for the whole party. Pass it back as quoted_total_minor` on create_booking: if the price has moved since you quoted it, the booking is refused rather than charged at a figure the traveller never agreed to.
get_property_info
ChatGPTGet property details for a tourism operator. Returns name, location, description, services summary, and cancellation policy. Use this to learn about an operator before calling get_services.
get_road_conditions
ChatGPTGet live road conditions in Iceland from Vegagerðin. Returns condition (Easily passable, Slippery, Snow, Closed, etc.) for road segments matching the query. Omit road_name for major tourist routes (Ring Road, Golden Circle, South Coast).
get_safety_alerts
ChatGPTGet active safety alerts from SafeTravel.is for a location. Provide either operator_id OR latitude+longitude. Response includes location with name, latitude, longitude for map context.
get_services
ChatGPTGet detailed service list for an operator. Returns id, name, description, price_isk, type, and max_guests for each service. Provider-backed lodging also returns unit_kind and units. When unit_kind is `bed`, describe it with unit_description verbatim and never call it a room. Use the returned service_id in check_availability, get_price_quote, and create_booking.
get_weather
ChatGPTGet live weather forecast for a location from Vedurstofa. Provide either operator_id OR latitude+longitude. Returns temperature, wind, conditions for today and next 2-3 days. Response includes location with name, latitude, longitude for map context.
search_itineraries
ChatGPTSearch vetted multi-day itineraries (routes) curated from destination sources. ONLY call this when the traveler has named a specific Icelandic region and you want a pre-vetted route for it. This is not a general trip-planning tool and it has no opinion about where someone should go: coverage is a handful of regions, so treating it as "show me an itinerary" produces a route for the wrong part of the country. Without a region it returns nothing, by design. When it returns nothing, compose the itinerary yourself — that is the expected path, not a failure, and it is always better than offering a route for a region the traveler did not ask about. Each itinerary returns ordered, geocoded key_stops plus the route's travel scale (duration_days, total_distance_km, and a summary that flags long driving distances). To build a bookable trip, take each stop's latitude/longitude and call search_operators(latitude, longitude, radius_km) near it (or use search_operators_near_itinerary to do every stop in one call). Itineraries are operator-agnostic: they describe a route, never specific operators. PLAN FROM THE ARRIVAL POINT, not the first stop. Most tourists fly into Keflavik (KEF) and start near Reykjavik, so a route that begins in a far region (the Westfjords stops below start at Holmavik, ~5 hours from Reykjavik) needs the drive from Reykjavik to the first stop and back to departure built into the plan. Use total_distance_km and the "long, slow roads" note to set realistic daily pacing; never present the route as if the tourist were already at stop one.
search_licensed_operators
ChatGPTSearch Iceland's public licensed-operator register, ranked by relevance. Results are informational registry facts, not Sóley booking inventory. Online booking through Sóley isn’t available for this operator yet. You can contact the operator directly in the meantime. For traveler follow-up, use only the listing's public website or phone. Frame results as 'licensed operator, verified contact' or 'licensed operator, public record'; 'bookable here' describes search_operators results. For completeness questions, call both tools and group the answer by capability. Based on Iceland's official operator registers. Never frame operators by membership.
search_operators
ChatGPTSearch for tourism operators by location, service type, and price range. Called with no parameters: returns all operators on the network. Use latitude/longitude/radius_km for proximity search. Results include latitude, longitude, and operator_id for each operator. Render operators as markers on a map. Use operator_id in get_property_info and get_services.
search_operators_near_itinerary
ChatGPTFind operators near EVERY stop of a curated itinerary, in one call. Use this after search_itineraries instead of calling search_operators once per stop: it reads the route's ordered, geocoded stops and returns what is near each one in a single round trip, with a rural-correct radius so route operators are not missed. The itinerary stays operator-agnostic — this reads the route and finds operators near it; it never embeds operators in the itinerary itself. Each stop carries TWO separate arrays, and they are not interchangeable: - `operators — connected Sóley operators. Bookable through this server: continue with get_services, check_availability, create_booking. - registry_listings — entries from Iceland's public licensed-operator registers. Informational only. They carry bookable: false, and must never be presented as available to reserve through Sóley. Their returned result_kinds.registry_listings guidance carries the canonical direct- contact instruction. Each entry states the basis of its coordinates in location_note: a licensed address, an approximate postcode centroid, or an owner-supplied point. For day-tour operators and travel agencies the registered address is an office, not a departure point — repeat that caveat rather than implying a meeting place. Describe results by capability, never by membership. Present the registry_presentation.attribution string verbatim when you use register entries. registry_total_count` per stop is the unclipped match count — when it exceeds what is returned, call search_licensed_operators with that stop's place or region for the full ranked list. Operators and listings may appear under more than one nearby stop.
send_message_to_operator
ChatGPTSend a message from the tourist to a human operator. Use this when the tourist has a question the AI cannot answer, needs special arrangements, or explicitly asks to speak with someone. The operator is notified immediately in the Sóley operator portal. After sending, automatically call check_operator_replies every 15 seconds to get the operator's response. Present replies to the user as they arrive. Requires OAuth2 authentication.