Save a trip plan made with the traveler into Mappu, where they keep trips as day-by-day itineraries on a map, edit them and take them along. Use this tool when the traveler wants to keep the plan you agreed on, and send it whole, whether or not you read the planning guide: each day's theme and stops in order with start times, every stop with a 100 to 150 word description and a tip, and every day with its food and up to three practical tips. The input fields describe the format Mappu stores. Mappu's walks and audio guides are extras, never a day's outline. Mappu stores the plan as given, does not generate, book or charge anything, and matches stops to real places once the traveler keeps it. Returns a link the traveler opens to see and keep the plan; drafts expire after 7 days. Reuse the same idempotencyKey only when retrying the same plan.
View input schema
{
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "An inviting trip title, e.g. \"Lisbon: Miradouros, Alleys and Grilled Sardines\"."
},
"summary": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "One or two sentences that set the scene: what this trip is about and why it suits this traveler, their interests, pace and the season they travel in."
},
"locale": {
"type": "string",
"enum": [
"en",
"it",
"es",
"fr",
"de",
"pt",
"ja",
"zh-tw"
],
"description": "Language every text field is written in: the language of the conversation."
},
"destinations": {
"type": "array",
"minItems": 1,
"maxItems": 4,
"description": "Cities or regions in the order the traveler visits them.",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "City or region, as a traveler would search for it."
},
"country": {
"type": "string",
"minLength": 1,
"maxLength": 80,
"description": "Country of the destination."
}
}
}
},
"startDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "First day as YYYY-MM-DD, only when the traveler gave dates."
},
"endDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Last day as YYYY-MM-DD. At most 30 days after startDate."
},
"days": {
"type": "array",
"minItems": 1,
"maxItems": 30,
"description": "One entry per day, serving at least one of the traveler's interests, with stops grouped by area so the route does not double back. Every day has its food and practical tips.",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"dayNumber",
"title",
"stops"
],
"properties": {
"dayNumber": {
"type": "integer",
"minimum": 1,
"maximum": 30,
"description": "1 for the first day, then consecutive."
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Date of this day as YYYY-MM-DD, when known."
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "An evocative theme for the day, like a chapter title, e.g. \"Royal Palaces & Riverside Soul\". No times, and not the title of a published walk or tour."
},
"destination": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "Which destinations[].name this day is spent in. Required when the trip has more than one destination; on a travel day, where the day ends."
},
"stops": {
"type": "array",
"minItems": 1,
"maxItems": 12,
"description": "What the traveler does this day, in order: sights, walks, meals at named venues, experiences. Morning, afternoon and evening each include a real place; leave room to rest.",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"description"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "An inviting title for the stop: the place and what makes it special, e.g. \"The Real Alcázar: Mudéjar Masterpiece\" or \"Sunset at Miradouro da Senhora do Monte\"."
},
"place": {
"type": "string",
"minLength": 1,
"maxLength": 250,
"description": "The real place for the map as \"Place, City\", e.g. \"Miradouro da Senhora do Monte, Lisbon\". Name a restaurant or bar only when you are confident it exists and fits; otherwise name the market, street or district. Omit for stops with no single place."
},
"kind": {
"type": "string",
"enum": [
"landmark",
"museum",
"church",
"viewpoint",
"park",
"nature",
"beach",
"neighborhood",
"food",
"cafe",
"bar",
"market",
"shopping",
"nightlife",
"experience",
"transport"
],
"description": "What kind of stop this is."
},
"startTime": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
"description": "Local start time as HH:MM (24-hour). Each stop starts after the previous one ends plus the time to get there. Check opening days and hours against this day's actual weekday and the season; never schedule a known closure."
},
"timeOfDay": {
"type": "string",
"enum": [
"morning",
"afternoon",
"evening",
"night"
],
"description": "Only when no startTime fits, e.g. a flexible evening."
},
"durationMinutes": {
"type": "integer",
"minimum": 5,
"maximum": 600,
"description": "Time spent here."
},
"description": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "100 to 150 words on what the stop is and why it suits this traveler (nearer 100 for trips over a week, so the plan fits one save): the story or history behind the place, the details worth finding, and how it ties to their interests and the season. Rich and specific, never generic, speaking to the traveler; a short aside in parentheses is welcome, e.g. \"(locals come at dusk)\". No times: they go in startTime and durationMinutes. Plain text: links are removed, so name a Mappu audio guide instead of linking it."
},
"tip": {
"type": "string",
"minLength": 1,
"maxLength": 500,
"description": "One insider tip, as a friend who lives there would give it: the best time to go, what to order, where to stand for the view, how to skip a queue, whether to book ahead. Do not invent prices or schedules; say when something should be checked. Plain text, no links."
},
"highlights": {
"type": "array",
"maxItems": 5,
"description": "Up to five things not to miss here, as short phrases. Omit when the description covers it.",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "One thing not to miss, as a short phrase."
}
},
"getThere": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "How to get here from the previous stop when it is more than a short walk: the mode, the line or route if well known, and roughly how long it takes, e.g. \"Tram 28 to Graça, about 20 min\"."
},
"note": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Older short form of tip; prefer description and tip."
}
}
}
},
"food": {
"type": "object",
"additionalProperties": false,
"required": [
"text"
],
"description": "Every day has one: the day's food story, what to eat today and why it fits the day, the place and the season.",
"properties": {
"text": {
"type": "string",
"minLength": 1,
"maxLength": 1200,
"description": "What to eat today, in 60 to 100 words: the dishes or specialities to try today, where they shine (a market, a street or a venue you are confident about), the tradition behind them and why they fit the day."
},
"cuisine": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Cuisine or speciality, e.g. \"Portuguese seafood\"."
},
"pricePoint": {
"type": "string",
"enum": [
"$",
"$$",
"$$$",
"$$$$"
],
"description": "Typical price level."
},
"place": {
"type": "string",
"minLength": 1,
"maxLength": 250,
"description": "A food place for the map as \"Place, City\", when there is one."
}
}
},
"tips": {
"type": "array",
"maxItems": 3,
"description": "Every day has one to three practical tips: weather and season, closures and holidays, bookings to make, transport passes, safety.",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 400,
"description": "One practical tip in a sentence or two, friendly and specific."
}
}
}
}
},
"idempotencyKey": {
"type": "string",
"minLength": 16,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$",
"description": "Random key for this plan. Reuse it only to retry the same plan."
}
},
"required": [
"title",
"locale",
"destinations",
"days",
"idempotencyKey"
],
"additionalProperties": false,
"description": "A trip plan as Mappu stores it. Leave out any optional field you have nothing for; never send null. Text is plain: links are removed. Times go in startTime and durationMinutes."
}