{"openapi":"3.1.0","info":{"title":"Whatsdo Actions","version":"1.0.0"},"servers":[{"url":"https://app.whatsdo.com"}],"paths":{"/actions/search":{"post":{"operationId":"search","summary":"Search for restaurants, gyms, yoga studios, etc.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"location_text":{"type":["string","null"]}},"required":["query"]}}}},"responses":{"200":{"description":"Search results"}}}},"/actions/search/structured":{"post":{"operationId":"searchStructured","summary":"Search with a pre-parsed query (keywords, tags, filters)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"keywords":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}},"excluded_tags":{"type":"array","items":{"type":"string"}},"category":{"type":["string","null"],"enum":["food","gym","beauty_spa","massage","event_planning","hotels_travel","nightlife","pets","professional_services","active_life",null]},"venue_name":{"type":["string","null"]},"is_online":{"type":["boolean","null"]},"is_free":{"type":["boolean","null"]},"price_range":{"type":["string","null"],"enum":["budget","mid","upscale",null]},"booking_intent":{"type":"boolean"},"location_text":{"type":["string","null"]},"user_coords":{"type":["object","null"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"description":"Exact coordinates (device GPS); they beat any saved location."},"radius_km":{"type":["number","null"],"minimum":1,"maximum":50},"bookable_only":{"type":"boolean"},"open_at":{"type":["string","null"]},"open_now":{"type":"boolean"},"personalize":{"type":"boolean"},"limit":{"type":"integer"},"offset":{"type":"integer"}},"required":["query"]}}}},"responses":{"200":{"description":"Search results"}}}},"/actions/search/vocabulary":{"get":{"operationId":"searchVocabulary","summary":"List allowed values for a structured search field","parameters":[{"name":"field","in":"query","required":false,"schema":{"type":"string"}},{"name":"q","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Vocabulary values by field"}}}},"/actions/reserve":{"post":{"operationId":"reserve","summary":"Book a table, class, or session","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"item_id":{"type":"string"},"item_name":{"type":"string"},"item_type":{"type":"string","description":"Accepted and ignored: the venue type is derived from item_id. Kept for older callers."},"date_time":{"type":"string"},"party_size":{"type":"integer"},"special_requests":{"type":["string","null"]},"source":{"type":"string","enum":["square","opentable","mindbody","yelp_ai","website","manual"],"description":"Booking provider from bookable_via"},"location":{"type":["string","null"]},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"guest_name":{"type":["string","null"]},"guest_phone":{"type":["string","null"]},"guest_email":{"type":["string","null"]}},"required":["item_id","item_name","date_time","party_size","source"]}}}},"responses":{"200":{"description":"Reservation confirmation or alternatives"}}}},"/actions/reserve/yelp-ai/chat":{"post":{"operationId":"yelpAiChat","summary":"Continue Yelp AI conversation for CC hold flow","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"chat_id":{"type":"string"},"message":{"type":"string"},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]}},"required":["chat_id","message"]}}}},"responses":{"200":{"description":"Yelp AI chat response"}}}},"/actions/history":{"get":{"operationId":"history","summary":"Get past reservations for the current user","responses":{"200":{"description":"Reservation list"}}}},"/actions/location":{"post":{"operationId":"saveLocation","summary":"Save or update user's location","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string"}},"required":["label"]}}}},"responses":{"200":{"description":"Geocoded location saved"}}}},"/actions/calendar/free":{"get":{"operationId":"calendarFree","summary":"Get free time slots for a date","parameters":[{"name":"date","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Free slots"}}}},"/actions/calendar/event":{"post":{"operationId":"calendarEvent","summary":"Add a confirmed booking to Google Calendar","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"date_time":{"type":"string"},"duration_mins":{"type":"integer"},"confirmation_number":{"type":"string"},"address":{"type":"string"},"party_size":{"type":"integer"},"item_type":{"type":"string"},"special_requests":{"type":"string"}},"required":["title","date_time"]}}}},"responses":{"200":{"description":"Calendar event created"}}}}}}