Every API here is available over the APIs.io API and to AI agents over MCP.
{"openapi":"3.0.3","info":{"title":"Goyondo API","description":"API for trip planning, itineraries, and bookings. Use with Bearer token (Clerk session or API key gyd_*).","version":"1.0.0"},"servers":[{"url":"https://goyondo.run"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Clerk session token or Goyondo API key (prefix gyd_)"}},"schemas":{"Error":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","example":"validation_failed"},"message":{"type":"string"},"details":{"type":"array","items":{}}}}}},"CapabilityDefinition":{"type":"object","properties":{"name":{"type":"string","enum":["describe_capabilities","get_schema","list_trips","get_trip","create_trip","update_trip","regenerate_itinerary","add_activity","update_activity","save_itinerary","list_activities","search_places","get_trip_alerts","delete_activity","get_user_preferences","list_itinerary_segments","get_trip_document","get_trip_expense_summary","submit_group_preferences","submit_group_inspiration","get_group_board","react_to_place","update_place_candidate","update_user_preferences","create_group_trip","list_group_trips","delete_group_trip","join_group_trip","get_group_trip","run_alignment","get_alignment","list_proposals","approve_proposal","reject_proposal","get_edit_log","set_user_preference","get_preference_profile","update_day_notes","delete_trip","get_share_link","create_share_link","disable_share_link","list_fixed_plans","add_fixed_plan","update_fixed_plan","delete_fixed_plan","respond_to_alignment","extend_alignment_rounds","get_alignment_history","get_inspiration","list_community_itineraries","get_community_itinerary"]},"description":{"type":"string"},"auth_required":{"type":"boolean","example":true},"implementation_status":{"type":"string","enum":["implemented"],"description":"Implementation state of the published capability."},"exposed_via":{"type":"array","items":{"type":"string","enum":["task","mcp"]}},"input_schema":{"type":"object","description":"JSON Schema describing capability arguments."}}},"AgentCapabilitiesResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"capabilities":{"type":"array","items":{"$ref":"#/components/schemas/CapabilityDefinition"}}}},"AgentTaskRequest":{"type":"object","required":["capability"],"properties":{"capability":{"type":"string","enum":["describe_capabilities","get_schema","list_trips","get_trip","create_trip","update_trip","regenerate_itinerary","add_activity","update_activity","save_itinerary","list_activities","search_places","get_trip_alerts","delete_activity","get_user_preferences","list_itinerary_segments","get_trip_document","get_trip_expense_summary","submit_group_preferences","submit_group_inspiration","get_group_board","react_to_place","update_place_candidate","update_user_preferences","create_group_trip","list_group_trips","delete_group_trip","join_group_trip","get_group_trip","run_alignment","get_alignment","list_proposals","approve_proposal","reject_proposal","get_edit_log","set_user_preference","get_preference_profile","update_day_notes","delete_trip","get_share_link","create_share_link","disable_share_link","list_fixed_plans","add_fixed_plan","update_fixed_plan","delete_fixed_plan","respond_to_alignment","extend_alignment_rounds","get_alignment_history","get_inspiration","list_community_itineraries","get_community_itinerary"],"description":"Capability name from GET /api/agent/capabilities"},"arguments":{"type":"object","description":"Arguments for the selected capability. See capability input_schema for exact fields."}}},"AgentTaskResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"result":{"type":"object","description":"Capability-specific response payload."}}},"DeviceAuthRequest":{"type":"object","required":["agent_name","requested_scopes"],"properties":{"agent_name":{"type":"string","example":"My Travel Agent"},"requested_scopes":{"type":"array","items":{"type":"string","enum":["trips:read","trips:write","bookings:read","bookings:write","preferences:read","group_trips:read","group_trips:write"]},"example":["trips:read","trips:write"]}}},"DeviceAuthResponse":{"type":"object","properties":{"user_code":{"type":"string","example":"GYD-A3F9"},"verification_url":{"type":"string","format":"uri","example":"https://goyondo.run/connect"},"verification_uri_complete":{"type":"string","format":"uri","example":"https://goyondo.run/connect?code=GYD-A3F9"},"device_code":{"type":"string","example":"<opaque 64-char hex>"},"expires_in":{"type":"integer","example":600},"interval":{"type":"integer","example":5}}},"DeviceTokenRequest":{"type":"object","required":["device_code"],"properties":{"device_code":{"type":"string","example":"<opaque 64-char hex>"}}},"DeviceTokenResponse":{"type":"object","properties":{"access_token":{"type":"string","example":"gyd_..."},"token_type":{"type":"string","example":"bearer"},"scope":{"type":"string","example":"trips:read trips:write"}}},"DeviceTokenError":{"type":"object","properties":{"error":{"type":"string","example":"authorization_pending"},"error_description":{"type":"string","example":"Waiting for user approval"}}},"Location":{"type":"object","description":"City-level location (home base or trip origin). Give city or airport_iata; the server resolves coordinates, timezone and, when omitted, the nearest airport.","properties":{"city":{"type":"string","example":"Singapore"},"country":{"type":"string"},"airport_iata":{"type":"string","pattern":"^[A-Za-z]{3}$","example":"SIN"}}},"TripCreate":{"type":"object","required":["destination","start_date","end_date"],"properties":{"destination":{"type":"string"},"start_date":{"type":"string","format":"date"},"end_date":{"type":"string","format":"date"},"timezone":{"type":"string","description":"Traveler IANA time zone (e.g. America/Los_Angeles). Used to decide whether start_date is in the past. Not stored."},"travelers":{"type":"integer","default":1},"interests":{"type":"array","items":{"type":"string"}},"dietary_restrictions":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":100}},"children":{"type":"object","description":"Optional family composition. The total must leave at least one adult in travelers.","properties":{"infants":{"type":"integer","minimum":0},"children":{"type":"integer","minimum":0},"teens":{"type":"integer","minimum":0}}},"travel_style":{"type":"string","enum":["budget","comfort","luxury"],"description":"Spending level. Older values adventure, cultural and relaxation are still accepted and become comfort plus a matching interest."},"accommodation_type":{"type":"string","nullable":true,"enum":["hotel","hostel","rental","guesthouse","resort","camping",null],"description":"Kind of place to stay, used for suggestions; null for no preference. Older values airbnb and apartment become rental, bb becomes guesthouse."},"skip_ai_generation":{"type":"boolean","default":false},"origin":{"allOf":[{"$ref":"#/components/schemas/Location"}],"nullable":true,"description":"Where the trip starts. Omitted: copied from the user's home base. null: no origin. Never changes the home base. Used to plan Day 1 and the last day around the flight."},"arrival_time":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","description":"Local arrival time on Day 1 (HH:MM). Overrides the estimate from the origin."},"fixed_plans":{"type":"array","maxItems":15,"items":{"type":"object"},"description":"Tickets, reservations and must-sees the itinerary is built around. Each: title, timing (exact, day or flexible), category, place_id or city, sessions (one per day attended)."},"departure_time":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","description":"Local departure time on the last day (HH:MM)."},"groupTripCode":{"type":"string","description":"Collaborative group trip code. When present, the server loads board consensus and readiness context for itinerary generation."},"regeneration_mode":{"type":"string","enum":["replace","new_version"],"description":"Required when groupTripCode already has a linked itinerary. replace updates that itinerary; new_version creates and links a fresh trip."}}}}},"paths":{"/api/agent-manifest":{"get":{"summary":"Agent manifest","description":"Machine-readable description of capabilities and how to use the API","security":[],"responses":{"200":{"description":"Agent manifest JSON"}}}},"/api/agent/capabilities":{"get":{"summary":"List executable agent capabilities","description":"Canonical registry of task/MCP capabilities, their implementation status, and JSON argument schemas.","security":[],"responses":{"200":{"description":"Capability registry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentCapabilitiesResponse"},"example":{"success":true,"capabilities":[{"name":"describe_capabilities","description":"Describe available Goyondo agent capabilities, including input schemas, enum values, and supported interfaces. Use this for introspection before calling other capabilities.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"capability":{"type":"string","description":"Optional capability name to describe. Omit to list every capability."},"name":{"type":"string","description":"Alias for capability."}},"required":[]}},{"name":"get_schema","description":"Return the JSON input schema for one Goyondo capability, or all schemas if no capability is provided.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"capability":{"type":"string","description":"Optional capability name to fetch schema for."},"name":{"type":"string","description":"Alias for capability."}},"required":[]}},{"name":"list_trips","description":"List trips for the authenticated user, newest first. Returns trip id, destination, dates and status. Pages with limit and offset: when has_more is true, call again with offset set to next_offset.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":100,"description":"Maximum number of trips to return (up to 100). Defaults to all trips, or 20 when offset is set."},"offset":{"type":"integer","minimum":0,"description":"Number of trips to skip. Use next_offset from the previous page."}},"required":[]}},{"name":"get_trip","description":"Get a single trip by id including full itinerary (days and activities). trip.origin is where the trip starts and trip.journey the estimated flight hours and time difference (estimates; say \"about\").","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_id":{"type":"string","description":"UUID of the trip"}},"required":["trip_id"]}},{"name":"create_trip","description":"Create a new trip and optionally generate an AI itinerary, which can take up to a few minutes. Returns the created trip and itinerary. Pass fixed_plans for tickets, reservations and must-sees. To write the itinerary yourself, pass skip_ai_generation: true and then call save_itinerary with all the days in one call.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"destination":{"type":"string"},"start_date":{"type":"string","description":"ISO date YYYY-MM-DD"},"end_date":{"type":"string","description":"ISO date YYYY-MM-DD"},"timezone":{"type":"string","description":"Traveler IANA time zone, e.g. America/Los_Angeles. Used to validate that start_date is not in the past."},"travelers":{"type":"integer","default":1},"interests":{"type":"array","items":{"type":"string"}},"dietary_restrictions":{"type":"array","items":{"type":"string"}},"children":{"type":"object","description":"Optional family composition. The total must leave at least one adult in travelers.","properties":{"infants":{"type":"integer","minimum":0},"children":{"type":"integer","minimum":0},"teens":{"type":"integer","minimum":0}}},"travel_style":{"type":"string","enum":["budget","comfort","luxury"],"description":"Spending level. What the trip is about goes in interests."},"accommodation_type":{"type":"string","enum":["hotel","hostel","rental","guesthouse","resort","camping"],"description":"Kind of place to stay, for suggestions only (Goyondo does not book stays). rental means Airbnb or an apartment; guesthouse includes B&Bs. Omit for no preference."},"skip_ai_generation":{"type":"boolean","default":false,"description":"true creates the trip with empty days; fill them with save_itinerary."},"origin":{"type":"object","description":"Where this trip starts, if the user told you. Ask; never infer it from the user's location or language. Omit it to use the user's home base. Setting it never changes the home base. Goyondo uses it to plan Day 1 and the last day around the flight.","properties":{"city":{"type":"string","description":"City, e.g. \"Singapore\" or \"London, UK\""},"country":{"type":"string","description":"Country, optional"},"airport_iata":{"type":"string","description":"3-letter IATA airport code, optional; defaults to the nearest airport to the city"}}},"arrival_time":{"type":"string","description":"Local time the traveller lands on Day 1, HH:MM (24h). Only if the user knows it; otherwise Goyondo estimates from the origin."},"departure_time":{"type":"string","description":"Local time the traveller leaves on the last day, HH:MM (24h). Only if the user knows it."},"fixed_plans":{"type":"array","maxItems":15,"description":"Tickets, reservations and must-sees the itinerary must be built around. Ask the user for the place and timing; never guess them. Get place_id from search_places.","items":{"type":"object","properties":{"title":{"type":"string","description":"Name shown on the trip, max 80 chars. Display only; the planner does not read it."},"timing":{"type":"string","enum":["exact","day","flexible"],"description":"exact: set date and time. day: set date, planner picks the time. flexible: planner picks the day."},"category":{"type":"string","enum":["general","sightseeing","dining","entertainment","shopping","outdoor","cultural"]},"place_id":{"type":"string","description":"From search_places. Provide this or city."},"city":{"type":"string","description":"Only when the place cannot be found, such as a private address."},"sessions":{"type":"array","description":"One entry per day attended, within the trip dates. For a multi-day event, include only the days the user will go. Empty for flexible. start_time and end_time (HH:MM) only for exact.","items":{"type":"object","properties":{"date":{"type":"string","description":"YYYY-MM-DD"},"start_time":{"type":"string"},"end_time":{"type":"string"}},"required":["date"]}}},"required":["title","timing"]}},"groupTripCode":{"type":"string","description":"Collaborative group trip code. Server loads readiness and board context."},"regeneration_mode":{"type":"string","enum":["replace","new_version"],"description":"Required when the group already has a linked itinerary."}},"required":["destination","start_date","end_date"]}},{"name":"update_trip","description":"Update trip metadata such as dates, title, traveler count, budget, or status. When start_date or end_date changes, the response includes itinerary_dates showing the first and last day dates after the shift — verify these match your intended dates before proceeding.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_id":{"type":"string","description":"UUID of the trip"},"title":{"type":"string","description":"Trip title, max 255 chars"},"destination":{"type":"string","description":"Destination name"},"start_date":{"type":"string","description":"Start date in ISO format YYYY-MM-DD"},"end_date":{"type":"string","description":"End date in ISO format YYYY-MM-DD. May be sent without start_date. If both provided, end_date must be on or after start_date."},"travelers":{"type":"integer","description":"Number of travelers (1–20)"},"dietary_restrictions":{"type":"array","items":{"type":"string"}},"children":{"type":"object","description":"Optional family composition. The total must leave at least one adult in travelers.","properties":{"infants":{"type":"integer","minimum":0},"children":{"type":"integer","minimum":0},"teens":{"type":"integer","minimum":0}}},"budget_per_person":{"type":"number","description":"Budget per person"},"total_budget":{"type":"number","description":"Total budget"},"currency":{"type":"string","description":"3-letter currency code, e.g. USD"},"travel_style":{"type":"string","enum":["budget","comfort","luxury"],"description":"Spending level. What the trip is about goes in interests."},"accommodation_type":{"type":"string","enum":["hotel","hostel","rental","guesthouse","resort","camping"],"description":"Kind of place to stay, for suggestions only (Goyondo does not book stays). rental means Airbnb or an apartment; guesthouse includes B&Bs. Omit for no preference."},"status":{"type":"string","enum":["draft","confirmed","active","completed","cancelled"]},"notes":{"type":"string","description":"Free-text notes, max 2000 chars"},"origin":{"type":"object","description":"Where this trip starts. Ask the user; never infer it. Never changes the home base.","properties":{"city":{"type":"string","description":"City, e.g. \"Singapore\" or \"London, UK\""},"country":{"type":"string","description":"Country, optional"},"airport_iata":{"type":"string","description":"3-letter IATA airport code, optional; defaults to the nearest airport to the city"}}},"clear_origin":{"type":"boolean","description":"true removes the trip's origin."},"arrival_time":{"type":"string","description":"Local time the traveller lands on Day 1, HH:MM (24h). Only if the user knows it; otherwise Goyondo estimates from the origin."},"departure_time":{"type":"string","description":"Local time the traveller leaves on the last day, HH:MM (24h). Only if the user knows it."}},"required":["trip_id"]}},{"name":"regenerate_itinerary","description":"Regenerate the AI itinerary for an existing trip. Replaces AI suggestions only: fixed plans and activities the user or an agent added or edited are kept, and removed activities are not suggested again.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_id":{"type":"string","description":"UUID of the trip"}},"required":["trip_id"]}},{"name":"add_activity","description":"Add an activity to a trip. To assign to a specific day use itinerary_id (UUID from get_trip itinerary days — most reliable), date (YYYY-MM-DD), or day_number (1-based). If none are provided the activity lands on Day 1. The result includes warnings (duplicates, time overlaps) for the new activity; fix them or tell the user. To add several activities, use save_itinerary.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_id":{"type":"string","description":"UUID of the trip (from list_trips or get_trip)"},"title":{"type":"string","description":"Activity name, max 255 chars"},"description":{"type":"string","description":"Optional details, max 1000 chars"},"activity_type":{"type":"string","enum":["general","sightseeing","dining","transport","accommodation","entertainment","shopping","outdoor","cultural","business"],"description":"Canonical enum. Common aliases are accepted and normalized, e.g. event -> entertainment, food/dinner -> dining, meeting/conference -> business. Default: general"},"start_time":{"type":"string","description":"Time in HH:MM 24-hour format. HH:MM:SS and ISO-8601 date-time strings are accepted and normalized to HH:MM."},"end_time":{"type":"string","description":"Time in HH:MM 24-hour format. HH:MM:SS and ISO-8601 date-time strings are accepted and normalized to HH:MM."},"duration_minutes":{"type":"integer","description":"Duration in minutes"},"location":{"type":"string","description":"Venue or area name, max 255 chars"},"address":{"type":"string","description":"Full address, max 500 chars"},"estimated_cost":{"type":"number","description":"Cost per person in trip currency"},"priority":{"type":"integer","description":"1 (lowest) to 10 (highest), default 5"},"notes":{"type":"string","description":"Internal notes, max 1000 chars"},"metadata":{"type":"object","properties":{"overnight_transport":{"type":"boolean","description":"Set true only when this transport crosses midnight and is the traveler's overnight plan."}},"additionalProperties":false},"itinerary_id":{"type":"string","description":"UUID of the itinerary day (from get_trip itinerary[].id). Most reliable way to target a specific day."},"day_number":{"type":"integer","description":"Day of the trip (1 = first day). Use itinerary_id or date instead when available."},"date":{"type":"string","description":"Calendar date YYYY-MM-DD. Use itinerary_id instead when available."}},"required":["trip_id","title"]}},{"name":"update_activity","description":"Update an existing activity. All fields except trip_id and activity_id are optional. The result includes warnings (duplicates, time overlaps) involving the activity. Changing anything other than status marks the activity as the user's, so regenerate_itinerary keeps it.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_id":{"type":"string","description":"UUID of the trip"},"activity_id":{"type":"string","description":"UUID of the activity (from get_trip itinerary)"},"title":{"type":"string"},"description":{"type":"string"},"activity_type":{"type":"string","enum":["general","sightseeing","dining","transport","accommodation","entertainment","shopping","outdoor","cultural","business"],"description":"Canonical enum. Common aliases are accepted and normalized, e.g. event -> entertainment, food/dinner -> dining, meeting/conference -> business."},"start_time":{"type":"string","description":"HH:MM 24-hour format. HH:MM:SS and ISO-8601 date-time strings are accepted and normalized to HH:MM."},"end_time":{"type":"string","description":"HH:MM 24-hour format. HH:MM:SS and ISO-8601 date-time strings are accepted and normalized to HH:MM."},"duration_minutes":{"type":"integer"},"location":{"type":"string"},"address":{"type":"string"},"estimated_cost":{"type":"number"},"priority":{"type":"integer"},"notes":{"type":"string"},"metadata":{"type":"object","properties":{"overnight_transport":{"type":"boolean","description":"Set true only when this transport crosses midnight and is the traveler's overnight plan."}},"additionalProperties":false},"day_number":{"type":"integer","description":"Move the activity to a different trip day (1 = first day)."},"date":{"type":"string","description":"Move the activity to a specific calendar date YYYY-MM-DD."}},"required":["trip_id","activity_id"]}},{"name":"save_itinerary","description":"Save an itinerary you wrote to an existing trip in one call: every day and its activities. Use it after create_trip with skip_ai_generation: true, or to add to a trip. Append only: existing activities are kept, so call get_trip first and do not resend them. All activities are checked before anything is saved; if any is invalid nothing is saved and the error lists each problem. The result includes warnings (duplicates, time overlaps, repeats across days). Fix them with update_activity or delete_activity, then call get_trip_alerts. Limits: 31 days, 20 activities per day, 150 activities per call.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_id":{"type":"string","description":"UUID of the trip"},"days":{"type":"array","minItems":1,"maxItems":31,"description":"Days to fill. Give day_number (1 = first day) or date (YYYY-MM-DD) for each.","items":{"type":"object","properties":{"day_number":{"type":"integer","minimum":1},"date":{"type":"string","description":"YYYY-MM-DD within the trip dates"},"activities":{"type":"array","minItems":1,"maxItems":20,"description":"Same fields as add_activity, without trip_id or day fields. Give start_time and duration_minutes or end_time so overlaps can be checked.","items":{"type":"object","properties":{"title":{"type":"string","description":"Activity name, max 255 chars"},"description":{"type":"string"},"activity_type":{"type":"string","enum":["general","sightseeing","dining","transport","accommodation","entertainment","shopping","outdoor","cultural","business"]},"start_time":{"type":"string","description":"HH:MM 24-hour"},"end_time":{"type":"string","description":"HH:MM 24-hour"},"duration_minutes":{"type":"integer"},"location":{"type":"string","description":"Venue name, used for opening-hours and travel checks"},"address":{"type":"string"},"estimated_cost":{"type":"number"},"notes":{"type":"string"},"metadata":{"type":"object","properties":{"overnight_transport":{"type":"boolean","description":"Set true only when this transport crosses midnight and is the traveler's overnight plan."}},"additionalProperties":false}},"required":["title"]}}},"required":["activities"]}}},"required":["trip_id","days"]}},{"name":"list_activities","description":"List all activities for a trip as a flat array.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_id":{"type":"string","description":"UUID of the trip"}},"required":["trip_id"]}},{"name":"search_places","description":"Find a venue by name and return matching places with their place_id, for use in create_trip fixed_plans.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"query":{"type":"string","description":"Venue name, ideally with the city, e.g. Tokyo Dome"}},"required":["query"]}},{"name":"get_trip_alerts","description":"Check a trip's plan and return its alerts: venues closed or outside opening hours, public holidays, too much travel or backtracking, duplicates, time overlaps, pace, and fixed plans that clash, leave too little travel time, fall outside the trip or could not be placed. Each alert has a scope (activity, day or trip) and affected_activity_ids: the activities it is about, every activity on that day for a day alert, or an empty list for a trip alert. Call it after you finish editing an itinerary and fix or report what it finds. Read-only.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_id":{"type":"string","description":"UUID of the trip"},"mode":{"type":"string","enum":["driving","walking","bicycling","transit"],"description":"Travel mode for travel-time checks. Default driving."}},"required":["trip_id"]}},{"name":"delete_activity","description":"Delete an activity from a trip. Regeneration will not suggest it again. If the activity belongs to a fixed plan, that day is removed from the plan, or the whole plan if it was the last day.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_id":{"type":"string"},"activity_id":{"type":"string"}},"required":["trip_id","activity_id"]}},{"name":"get_user_preferences","description":"Get the authenticated user's travel preferences (interests, dietary, accessibility, etc.). home_base is where they usually travel from (city and airport), or null.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{},"required":[]}},{"name":"list_itinerary_segments","description":"List the flights, hotel stays, car rentals and meetings saved on a trip, usually from pasted confirmations. Works on any trip; an empty list means none were added.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_id":{"type":"string","description":"UUID of the trip"}},"required":["trip_id"]}},{"name":"get_trip_document","description":"Get a document saved on a trip, such as a boarding pass or booking PDF, by id or by name (e.g. boarding pass for flight SQ321). Works on any trip.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_id":{"type":"string","description":"UUID of the trip"},"document_id":{"type":"string","description":"UUID of the document (optional if name provided)"},"name":{"type":"string","description":"Search by name substring (optional)"}},"required":["trip_id"]}},{"name":"get_trip_expense_summary","description":"Get the expense summary for a business trip (trip_mode: business), for expense reports. Do not use it for leisure trips.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_id":{"type":"string","description":"UUID of the trip"}},"required":["trip_id"]}},{"name":"submit_group_preferences","description":"Submit group trip preferences for alignment (Group Harmony). Use trip_code from the share link.\nThe caller must already be a member (call join_group_trip first).\nCanonical preferences shape (all keys optional, but alignment only reconciles dates, destination, and budget):\n dates: { ideal_start: \"YYYY-MM-DD\", ideal_end: \"YYYY-MM-DD\", flexibility_days: integer, blackout_dates: [\"YYYY-MM-DD\"] }\n destination: { top_choices: [\"City, Country\", ...], veto: [\"City, Country\", ...] }\n budget: { min: number, max: number } — MUST be an object. A scalar budget (e.g. 2000) is ignored by alignment and treated as 0.\n accommodation: string activities: [string, ...]\nFull example:\n {\"dates\":{\"ideal_start\":\"2026-04-10\",\"ideal_end\":\"2026-04-17\",\"flexibility_days\":3,\"blackout_dates\":[\"2026-04-13\"]},\n \"destination\":{\"top_choices\":[\"Tokyo, Japan\",\"Osaka, Japan\"],\"veto\":[\"Bangkok, Thailand\"]},\n \"budget\":{\"min\":1500,\"max\":2500},\"accommodation\":\"hotel\",\"activities\":[\"food tours\",\"museums\"]}\nResponse echoes trip_code and join_url so agents can persist context.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_code":{"type":"string","description":"Group trip code (e.g. from join URL)"},"preferences":{"type":"object","description":"Canonical preference object — see capability description for the full shape and example.","properties":{"dates":{"type":"object","properties":{"ideal_start":{"type":"string","description":"ISO date YYYY-MM-DD"},"ideal_end":{"type":"string","description":"ISO date YYYY-MM-DD"},"flexibility_days":{"type":"integer"},"blackout_dates":{"type":"array","items":{"type":"string","description":"ISO date YYYY-MM-DD"}}}},"destination":{"type":"object","properties":{"top_choices":{"type":"array","items":{"type":"string"},"description":"e.g. \"Tokyo, Japan\""},"veto":{"type":"array","items":{"type":"string"}}}},"budget":{"type":"object","description":"Object only — a scalar is ignored by alignment and treated as 0.","properties":{"min":{"type":"number"},"max":{"type":"number"}}},"accommodation":{"type":"string"},"activities":{"type":"array","items":{"type":"string"}}}}},"required":["trip_code","preferences"]}},{"name":"submit_group_inspiration","description":"Submit a link, raw text, or explicit place to a group inspiration board. Use trip_code from the group share link. Provide exactly one of url, text, or place.","auth_required":true,"implementation_status":"implemented","exposed_via":["task","mcp"],"input_schema":{"type":"object","properties":{"trip_code":{"type":"string","description":"Group trip code"},"url":{"type":"string","description":"URL to ingest into the board"},"text":{"type":"string","description":"Raw note/text to ingest into the board (max 5000 chars)"},"place":{"type":"object","description":"Explicit place candidate to add. Shape: { name: string (required), city: string, neighborhood: string, category: enum, blurb: string, confidence: enum }","properties":{"name":{"type":"string","description":"Required. Max 255 chars."},"city":{"type":"string","description":"Max 120 chars"},"neighborhood":{"type":"string","description":"Max 120
# --- truncated at 32 KB (70 KB total) ---
# Full source: https://artifacts.apis.io/goyondo-run/openapi/_original/goyondo-run-api-openapi.json