Goyondo API API

API for trip planning, itineraries, and bookings. Use with Bearer token (Clerk session or API key gyd_*).

GitHub OpenAPI

Operations 39

GET /api/agent-manifest Agent manifest
GET /api/agent/capabilities List executable agent capabilities
POST /api/agent-auth/device Initiate device authorization
POST /api/agent-auth/token Poll for approved device token
POST /api/agent/task Execute an agent capability
GET /api/openapi.json OpenAPI spec
GET /api/trips List trips
POST /api/trips Create trip
GET /api/trips/{id} Get trip and itinerary
PUT /api/trips/{id} Update trip
DELETE /api/trips/{id} Delete trip
GET /api/trips/{id}/fixed-plans List fixed plans and any overlaps between them
POST /api/trips/{id}/fixed-plans Add a fixed plan (up to 15 per trip). Place details are looked up from place_id.
PUT /api/trips/{id}/fixed-plans/{planId} Replace a fixed plan and update its activities on the itinerary
DELETE /api/trips/{id}/fixed-plans/{planId} Delete a fixed plan and its activities
POST /api/trips/{id}/regenerate Regenerate itinerary. Replaces AI suggestions only; fixed plans and user or agent edits are kept.
POST /api/trips/{id}/activities/bulk Add many activities in one call (save_itinerary). Append only; nothing is saved if any activity is invalid
GET /api/trips/{id}/intelligence Plan alerts (opening hours, holidays, travel, duplicates, overlaps, pace) plus travel legs and weather. get_trip_alerts returns the alerts
GET /api/trips/{id}/activities Get trip activities
POST /api/trips/{id}/activities Add activity
PUT /api/trips/{id}/activities/{activityId} Update activity
DELETE /api/trips/{id}/activities/{activityId} Delete activity
GET /api/users/me/preferences Get user preferences
PUT /api/users/me/preferences Update user preferences
GET /api/airports Search airports by IATA code, city or name (public, no auth)
GET /api/trips/{id}/concierge/state Get personal Concierge state for the authenticated traveler
PATCH /api/trips/{id}/concierge/settings Update personal Concierge settings
POST /api/trips/{id}/concierge/location Share a foreground GPS sample
DELETE /api/trips/{id}/concierge/location Clear personal location and stop sharing
POST /api/trips/{id}/concierge/events Report a personal status event (idempotent by client_event_id)
POST /api/trips/{id}/concierge/evaluate Request an evaluation (1/min/user/trip)
POST /api/trips/{id}/concierge/recommendations/{rid}/respond Dismiss, keep plan, or snooze a personal recommendation
POST /api/trips/{id}/concierge/recommendations/{rid}/apply Atomically apply a validated recovery option (editors only)
POST /api/trips/{id}/concierge/recommendations/{rid}/undo Undo an applied option if the trip revision is unchanged
GET /api/users/me/push-subscriptions List this user's Web Push subscriptions (no p256dh/auth in the response)
POST /api/users/me/push-subscriptions Create or update a Web Push subscription for the authenticated user
GET /api/public/trips/{token} Get shared trip (no auth)
GET /api/community/listings Browse live Community Hub listings (no auth)
GET /api/community/listings/{id} Get a live Community Hub listing (no auth)

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/goyondo-run:goyondo-api-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

goyondo-run-api-openapi.json Raw ↑
{"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