1. Get the schema
Download the reference JSON file and attach it to your AI chat so it can match the exact structure the app expects.
Download itinerary.json →2. Copy a prompt
Pick your preferred language below, fill in your trip details, and paste the whole block into your AI chatbot along with the schema file.
Jump to prompts →How it works
- Download
itinerary.jsonusing the button above — this is the reference structure your AI should follow. - Open the language section below that matches the language you want your itinerary written in, and copy the whole prompt block.
- Paste the prompt into ChatGPT, Claude, or another AI chatbot, fill in your trip constraints at the top (destination, dates, must-see places, pace, budget, etc.), and attach
itinerary.jsonso the AI can see the exact schema. - The AI should reply with a single JSON object only. Save that reply as a
.jsonfile somewhere accessible to your iPhone or iPad (Files app, iCloud Drive, AirDrop, etc.). - In the app, go to Settings → 📦 JSON and Markdown backup and import, optionally tap Validate JSON first, then tap Import itinerary and choose your file.
Good to know: a single-trip import merges the new trip alongside any trips you already have — it will not delete anything. Only use the full backup import if you intend to replace all of your app data.
Copy-paste prompts by language
Fill in your trip details once below — every language block updates automatically. Then just copy and paste.
English
You are generating a trip itinerary as a JSON object that will be imported directly into Vacay Trip Planner. Output only valid JSON — no prose, no markdown code fences, no explanations.
Write all human-readable itinerary text in this language: English
### Your trip details
- Destination(s): <<e.g. Tokyo + Yugawara>>
- Start date: <<YYYY-MM-DD>>
- End date: <<YYYY-MM-DD>>
- Origin city or airport: <<e.g. Bangkok BKK>>
- Must-see places: <<list>>
- Pace preference: <<e.g. 2 full sightseeing days, light travel days at the start and end>>
- Lodging preference: <<e.g. one hotel for the whole trip, prefer Ueno — for nights not already booked>>
- Reserved hotels: <<e.g. APA Hotel Asakusa, Tokyo, check-in 2027-03-12, check-out 2027-03-16. Write none if you have not booked yet>>
- Number of travelers: <<e.g. 2>>
- Traveler names (optional): <<e.g. Alex, Sam>>
- Trip currency: <<e.g. JPY>>
- Anything else: <<food preferences, mobility, avoid crowds, etc.>>
### Required output schema
The app only accepts a single-trip import wrapped in this envelope. Return the outer wrapper, not just the inner trip content.
{
"format": "com.chrishuang.vacaytrip",
"formatVersion": 1,
"exportedAt": "<<ISO 8601 timestamp, e.g. 2027-01-01T00:00:00.000Z>>",
"app": {
"name": "Vacay Trip Planner",
"version": "1.1",
"build": "1"
},
"trip": {
"trip": {
"...": "title, kicker, subtitle, startDate, endDate, theme, currency — see itinerary.json"
},
"days": [
{
"...": "n, iso, mon, dom, dow, theme, tag, title, items[], etc. — see itinerary.json",
"weatherLocation": {
"name": "string, the city/area this day is based in, e.g. 'Hanoi'",
"latitude": "number, city-level latitude",
"longitude": "number, city-level longitude",
"source": "auto"
}
}
],
"places": [
"... see attached itinerary.json ..."
],
"checklist": [
"... see attached itinerary.json ..."
],
"budget": {
"note": "Short estimate disclaimer, e.g. typical public prices looked up for these dates",
"target": "Comfortable trip total in the trip currency",
"tip": "One practical money tip",
"people": [
{
"id": "person-1",
"name": "Traveler 1"
},
{
"id": "person-2",
"name": "Traveler 2"
}
],
"expenses": [
{
"id": "expense-1",
"icon": "🏨",
"title": "Human-readable expense name, e.g. hotel nights or transit pass",
"amount": 0,
"currency": "JPY",
"categories": [
"lodging"
],
"paidBy": "person-1",
"split": "equal",
"splitWith": [
"person-1",
"person-2"
],
"shares": {},
"date": "YYYY-MM-DD",
"note": "Where the estimate came from, e.g. typical mid-range hotel in this area",
"receipts": []
}
]
}
}
}
Note the double nesting: the outer trip key is the import wrapper, and it contains its own inner trip object. Both are named trip on purpose. Do not flatten or rename either one. Match field names in the attached itinerary.json. You may add days and items, but do not rename or remove required keys.
The attached itinerary.json is the app's seed file. Match the inner trip object (planner.trips[0]), especially budget.people and budget.expenses. Do not copy the outer backup wrapper (backupFormat / planner).
### Important rules
1. Every must-see place must appear as an activity in days[].items or in places[].
2. Do not invent exact latitude/longitude, mapURL, or appleMapsURL for specific places. Omit those fields. EXCEPTION: every day MUST include weatherLocation with real city-level latitude/longitude for the city/area that day's activities are in (not necessarily the origin city). Use well-known city coordinates (e.g. Hanoi, Tokyo, Yugawara); without this the app cannot show weather for that day.
3. Do not invent phone numbers, opening hours, or ratings. Use an empty string instead of guessing.
4. Balance sightseeing versus travel and rest days according to the pace preference.
5. Build checklist from the destination, travel dates/season, and the specific activities in days[]. Add an Onsen group only if an onsen visit is in the itinerary; add cold-weather layers only if the season/region calls for it. Use typical climate knowledge; do not fetch live weather.
6. Output format, formatVersion, and the trip wrapper exactly as shown. The app rejects a bare inner object.
7. Every days[].items[] entry — regardless of type (flight, transit, activity, hotel) — MUST include a non-empty text field: a short human-readable summary (e.g. BKK → HND for a flight, the place name for an activity, the hotel name for a hotel). The app rejects any item missing text.
8. Return only the JSON object.
9. If reserved hotels are listed, they are already booked: do not change, replace, or omit them. Add each as a hotel item on the check-in day in days[].items, using the given hotel name in text. Plan each day's sightseeing around the city/area of the hotel for that night. Only suggest additional hotels for nights not already covered. If none are listed, choose lodging from the lodging preference.
10. Always include trip.budget with people (one object per traveler) and expenses (the trip wallet). Do not use the legacy budget.rows table. Leave receipts as []. Match paidBy and splitWith to budget.people ids. Expense categories must be from: food, drinks, transport, lodging, tickets, shopping, groceries, activities, fees, gifts, health, other.
11. Use web search or browsing to look up typical current public prices for this destination and dates: mid-range lodging (or the reserved hotel if listed), local transit, long-distance trains or buses in the itinerary, attraction tickets, and typical meals. Put each cost in budget.expenses as a number in the trip currency. Write a short source or assumption in each expense note. If you cannot browse, use well-known public 2026–2027 price ranges and say so in budget.note. Do not invent phone numbers, booking IDs, or receipt photos.
12. With 2 or more travelers: lodging, shared transit, and activities everyone does use split="equal" and splitWith=all traveler ids (group expenses). Optional personal extras use split="payer" (private). With 1 traveler, split="payer" is fine. Do not invent shopping sprees or souvenir totals unless the user asked. Omit international airfare unless the user asked to include it; if included, use a typical range and say it is an estimate.
日本語 (Japanese)
あなたはVacay Trip Plannerに直接読み込める旅行日程をJSONオブジェクトとして生成します。有効なJSONのみを出力し、説明文やMarkdownのコードフェンスは入れないでください。
人が読む旅程の文章はすべて次の言語で書いてください: 日本語
### 旅行の条件
- 目的地: <<例: 東京 + 湯河原>>
- 開始日: <<YYYY-MM-DD>>
- 終了日: <<YYYY-MM-DD>>
- 出発都市または空港: <<例: バンコク BKK>>
- 必ず行きたい場所: <<リスト>>
- ペースの希望: <<例: 観光をしっかり行う日を2日、残りは軽めの移動日>>
- 宿泊の希望: <<例: 旅行中は同じホテルに滞在、エリア: 上野 — まだ予約していない夜について>>
- 予約済みホテル: <<例: APAホテル浅草、東京、チェックイン 2027-03-12、チェックアウト 2027-03-16。未予約なら「なし」>>
- 旅行者の人数: <<例: 2>>
- 旅行者の名前(任意): <<例: Alex, Sam>>
- 旅行先の通貨: <<例: JPY>>
- その他: <<食の好み、移動の制約、混雑を避けたい等>>
### 必須の出力スキーマ
アプリは次のエンベロープで包んだ単一旅行の読み込みだけを受け付けます。内側の内容だけでなく、外側のラッパーごと返してください。
{
"format": "com.chrishuang.vacaytrip",
"formatVersion": 1,
"exportedAt": "<<ISO 8601 timestamp, e.g. 2027-01-01T00:00:00.000Z>>",
"app": {
"name": "Vacay Trip Planner",
"version": "1.1",
"build": "1"
},
"trip": {
"trip": {
"...": "title, kicker, subtitle, startDate, endDate, theme, currency — see itinerary.json"
},
"days": [
{
"...": "n, iso, mon, dom, dow, theme, tag, title, items[] など — itinerary.json を参照",
"weatherLocation": {
"name": "文字列。その日の行動の拠点となる都市/エリア(例: 'Hanoi')",
"latitude": "数値。都市レベルの緯度",
"longitude": "数値。都市レベルの経度",
"source": "auto"
}
}
],
"places": [
"... see attached itinerary.json ..."
],
"checklist": [
"... see attached itinerary.json ..."
],
"budget": {
"note": "見積もりの注記。例: この日程の一般的な公開価格を調べた目安",
"target": "旅の通貨での無理のない合計目安",
"tip": "実用的なお金のヒントを1つ",
"people": [
{
"id": "person-1",
"name": "旅行者 1"
},
{
"id": "person-2",
"name": "旅行者 2"
}
],
"expenses": [
{
"id": "expense-1",
"icon": "🏨",
"title": "人が読める支出名。例: ホテル泊数や交通パス",
"amount": 0,
"currency": "JPY",
"categories": [
"lodging"
],
"paidBy": "person-1",
"split": "equal",
"splitWith": [
"person-1",
"person-2"
],
"shares": {},
"date": "YYYY-MM-DD",
"note": "見積もりの根拠。例: このエリアの中級ホテルの目安",
"receipts": []
}
]
}
}
}
二重の入れ子に注意。外側のtripは読み込み用ラッパーで、その中にタイトルや日程などの内側のtripがあります。どちらもtripという名前です。平らにしたり名前を変えないでください。添付のitinerary.jsonのフィールド名に合わせてください。日や項目は追加してよいですが、必須キーの改名や削除はしないでください。
The attached itinerary.json is the app's seed file. Match the inner trip object (planner.trips[0]), especially budget.people and budget.expenses. Do not copy the outer backup wrapper (backupFormat / planner).
### 重要なルール
1. 必ず行きたい場所は、すべて days[].items の activity、または places[] に含めてください。
2. 特定の場所の正確な緯度経度、mapURL、appleMapsURLは創作せず、それらのフィールドは省略してください。例外: すべての日に、その日の行動が実際に行われる都市/エリア(出発都市とは限りません)の実際の都市レベルの緯度経度を持つ weatherLocation を必ず含めてください。著名な都市の座標(例: ハノイ、東京、湯河原)を使い、推測しないでください。これがないとアプリはその日の天気を表示できず、無関係な場所の天気を表示し続ける可能性があります。
3. 電話番号、営業時間、評価は不確かなものを創作せず、空文字 "" にしてください。
4. ペースの希望に合わせて、観光日と移動・休息日のバランスを取ってください。
5. チェックリストは目的地、旅行日程・季節、days[] で実際に計画したアクティビティに基づいて作ってください。行程に温泉がある場合にのみ Onsen グループを追加し、季節や地域が求める場合にのみ防寒着を追加してください。その時期の一般的な気候の知識を使い、リアルタイムの天気は取得しないでください。
6. format、formatVersion、trip ラッパーは示どおりに出力してください。内側のオブジェクトだけではアプリが拒否します。
7. days[].items[] の各項目は type(flight、transit、activity、hotel)に関わらず、空でない text が必要です。短く人が読める要約にしてください(例: フライトなら BKK → HND、アクティビティなら場所名、ホテルならホテル名)。text がないとアプリは拒否します。
8. JSONオブジェクトのみを返してください。
9. 予約済みホテルがある場合、それらはすでに予約済みです。変更・置き換え・省略しないでください。各ホテルをチェックイン日の days[].items に type が hotel の項目として追加し、text には指定のホテル名を入れてください。その夜に滞在するホテルの都市/エリアを拠点に観光を組んでください。予約で埋まっていない夜についてのみ追加のホテルを提案してください。予約なしの場合は宿泊の希望に従って選んでください。
10. trip.budget を必ず含め、people(旅行者1人につき1件)と expenses(旅のウォレット)を入れてください。旧形式の budget.rows は使わないでください。receipts は [] のまま。paidBy と splitWith は budget.people の id と一致させてください。支出の categories は次のいずれか: food, drinks, transport, lodging, tickets, shopping, groceries, activities, fees, gifts, health, other。
11. ウェブ検索やブラウジングで、この目的地と日程の一般的な現行の公開価格を調べてください。中級の宿泊(予約済みホテルがあればそれ)、地元交通、行程内の長距離列車やバス、観光チケット、一般的な食事。各費用を旅の通貨の数値として budget.expenses に入れてください。各支出の note に短い出典や前提を書いてください。閲覧できない場合はよく知られた 2026–2027 年の公開価格帯を使い、budget.note にその旨を書いてください。電話番号、予約番号、レシート写真は創作しないでください。
12. 旅行者が2人以上の場合、宿泊・共用の交通・全員で行うアクティビティは split="equal"、splitWith は全員の id(グループ支出)。任意の個人的な追加は split="payer"(非公開)。1人なら split="payer" でよい。ユーザーが頼まない限り、買い物やお土産の合計は創作しないでください。国際線運賃はユーザーが含めるよう頼まない限り省略し、含める場合は目安の価格帯を使い、見積もりである旨を書いてください。
Tiếng Việt (Vietnamese)
Bạn đang tạo lịch trình dạng đối tượng JSON để nhập trực tiếp vào Vacay Trip Planner. Chỉ xuất JSON hợp lệ — không văn xuôi, không hàng rào mã markdown, không giải thích.
Viết mọi chữ lịch trình dễ đọc bằng ngôn ngữ này: Tiếng Việt
### Chi tiết chuyến đi
- Điểm đến: <<e.g. Tokyo + Yugawara>>
- Ngày bắt đầu: <<YYYY-MM-DD>>
- Ngày kết thúc: <<YYYY-MM-DD>>
- Thành phố hoặc sân bay xuất phát: <<e.g. Bangkok BKK>>
- Địa điểm bắt buộc: <<list>>
- Nhịp độ mong muốn: <<e.g. 2 full sightseeing days, light travel days at the start and end>>
- Sở thích lưu trú: <<e.g. one hotel for the whole trip, prefer Ueno — for nights not already booked>>
- Khách sạn đã đặt: <<e.g. APA Hotel Asakusa, Tokyo, check-in 2027-03-12, check-out 2027-03-16. Write none if you have not booked yet>>
- Số người đi: <<e.g. 2>>
- Tên người đi (tuỳ chọn): <<e.g. Alex, Sam>>
- Tiền tệ chuyến đi: <<e.g. JPY>>
- Khác: <<food preferences, mobility, avoid crowds, etc.>>
### Cấu trúc đầu ra bắt buộc
Ứng dụng chỉ nhận một chuyến được bọc trong envelope này. Hãy trả lớp bọc ngoài, không chỉ nội dung bên trong.
{
"format": "com.chrishuang.vacaytrip",
"formatVersion": 1,
"exportedAt": "<<ISO 8601 timestamp, e.g. 2027-01-01T00:00:00.000Z>>",
"app": {
"name": "Vacay Trip Planner",
"version": "1.1",
"build": "1"
},
"trip": {
"trip": {
"...": "title, kicker, subtitle, startDate, endDate, theme, currency — see itinerary.json"
},
"days": [
{
"...": "n, iso, mon, dom, dow, theme, tag, title, items[], v.v. — xem itinerary.json",
"weatherLocation": {
"name": "chuỗi, thành phố/khu vực mà ngày đó diễn ra, vd: 'Hanoi'",
"latitude": "số, vĩ độ cấp thành phố",
"longitude": "số, kinh độ cấp thành phố",
"source": "auto"
}
}
],
"places": [
"... see attached itinerary.json ..."
],
"checklist": [
"... see attached itinerary.json ..."
],
"budget": {
"note": "Ghi chú ước tính, vd: giá công khai điển hình tra cho các ngày này",
"target": "Tổng thoải mái của chuyến đi theo tiền tệ chuyến đi",
"tip": "Một mẹo tiền thực tế",
"people": [
{
"id": "person-1",
"name": "Người đi 1"
},
{
"id": "person-2",
"name": "Người đi 2"
}
],
"expenses": [
{
"id": "expense-1",
"icon": "🏨",
"title": "Tên chi tiêu dễ đọc, vd: đêm khách sạn hoặc vé giao thông",
"amount": 0,
"currency": "JPY",
"categories": [
"lodging"
],
"paidBy": "person-1",
"split": "equal",
"splitWith": [
"person-1",
"person-2"
],
"shares": {},
"date": "YYYY-MM-DD",
"note": "Nguồn ước tính, vd: khách sạn tầm trung điển hình ở khu này",
"receipts": []
}
]
}
}
}
Lưu ý lồng hai lớp: khóa trip ngoài là lớp bọc nhập, bên trong có object trip (tiêu đề/ngày). Cả hai cố ý tên là trip. Đừng làm phẳng hay đổi tên. Khớp tên trường trong itinerary.json đính kèm. Có thể thêm ngày/mục, nhưng đừng đổi tên hoặc xóa khóa bắt buộc.
The attached itinerary.json is the app's seed file. Match the inner trip object (planner.trips[0]), especially budget.people and budget.expenses. Do not copy the outer backup wrapper (backupFormat / planner).
### Quy tắc quan trọng
1. Mọi địa điểm bắt buộc phải xuất hiện dưới dạng activity trong days[].items hoặc trong places[].
2. Không bịa tọa độ latitude/longitude hay liên kết mapURL/appleMapsURL cho địa điểm cụ thể — hãy bỏ các trường này. NGOẠI LỆ: mỗi ngày BẮT BUỘC phải có weatherLocation với latitude/longitude cấp thành phố thực tế cho thành phố/khu vực mà hoạt động ngày đó diễn ra (không nhất thiết là thành phố xuất phát). Dùng tọa độ các thành phố nổi tiếng (vd: Hà Nội, Tokyo, Yugawara); nếu thiếu, ứng dụng không hiện thời tiết ngày đó và có thể hiện thời tiết của nơi không liên quan.
3. Đừng bịa số điện thoại, giờ mở cửa hoặc đánh giá. Dùng chuỗi rỗng thay vì đoán.
4. Cân bằng ngày tham quan với ngày di chuyển/nghỉ theo nhịp độ mong muốn.
5. Tạo checklist từ điểm đến, ngày/mùa đi, và hoạt động cụ thể trong days[]. Chỉ thêm nhóm Onsen nếu lịch trình thực sự có suối nước nóng; chỉ thêm đồ giữ ấm nếu mùa/khu vực đòi hỏi. Dùng kiến thức khí hậu điển hình; đừng lấy thời tiết trực tiếp.
6. Xuất format, formatVersion và lớp bọc trip đúng như mẫu. Ứng dụng từ chối object bên trong trần.
7. Mọi mục trong days[].items[] — bất kể type (flight, transit, activity, hotel) — phải có trường text không rỗng: tóm tắt ngắn, dễ đọc (vd: BKK → HND cho chuyến bay, tên địa điểm cho hoạt động, tên khách sạn cho khách sạn). Thiếu text thì ứng dụng từ chối.
8. Chỉ trả về đối tượng JSON.
9. Nếu có khách sạn đã đặt, chúng đã được đặt: không đổi, thay hoặc bỏ. Thêm mỗi khách sạn như mục hotel vào ngày nhận phòng trong days[].items, dùng tên đã cho trong text. Lên lịch tham quan quanh thành phố/khu vực khách sạn đêm đó. Chỉ gợi ý thêm khách sạn cho đêm chưa được đặt. Nếu không có, chọn chỗ ở theo sở thích lưu trú.
10. Luôn gồm trip.budget với people (một object mỗi người) và expenses (ví chuyến đi). Đừng dùng bảng budget.rows cũ. Để receipts là []. Khớp paidBy và splitWith với id trong budget.people. categories phải thuộc: food, drinks, transport, lodging, tickets, shopping, groceries, activities, fees, gifts, health, other.
11. Dùng tìm trên web hoặc duyệt web để tra giá công khai hiện tại điển hình cho điểm đến và ngày này: lưu trú tầm trung (hoặc khách sạn đã đặt nếu có), giao thông địa phương, tàu/xe đường dài trong lịch trình, vé tham quan, và bữa ăn điển hình. Đặt mỗi khoản vào budget.expenses bằng số theo tiền tệ chuyến đi. Ghi nguồn hoặc giả định ngắn trong note của từng chi tiêu. Nếu không duyệt được, dùng khoảng giá công khai 2026–2027 đã biết và nói rõ trong budget.note. Đừng bịa số điện thoại, mã đặt chỗ, hay ảnh hoá đơn.
12. Với 2 người trở lên: lưu trú, giao thông dùng chung, và hoạt động mọi người đều làm dùng split="equal" và splitWith=mọi id (chi tiêu nhóm). Khoản phụ cá nhân tuỳ chọn dùng split="payer" (riêng tư). Với 1 người, split="payer" được. Đừng bịa shopping hay tổng quà lưu niệm trừ khi người dùng yêu cầu. Bỏ vé máy bay quốc tế trừ khi được yêu cầu; nếu gồm, dùng khoảng điển hình và nói đó là ước tính.
繁體中文 (Traditional Chinese)
你正在產生一份可直接匯入 Vacay Trip Planner 的 JSON 行程。只輸出有效 JSON——不要說明、不要 Markdown 程式碼區塊。
所有給人看的行程文字請用這個語言撰寫: 繁體中文
### 旅程條件
- 目的地: <<e.g. Tokyo + Yugawara>>
- 開始日期: <<YYYY-MM-DD>>
- 結束日期: <<YYYY-MM-DD>>
- 出發城市或機場: <<e.g. Bangkok BKK>>
- 必去景點: <<list>>
- 節奏偏好: <<e.g. 2 full sightseeing days, light travel days at the start and end>>
- 住宿偏好: <<e.g. one hotel for the whole trip, prefer Ueno — for nights not already booked>>
- 已預訂飯店: <<e.g. APA Hotel Asakusa, Tokyo, check-in 2027-03-12, check-out 2027-03-16. Write none if you have not booked yet>>
- 旅客人數: <<e.g. 2>>
- 旅客姓名(選填): <<e.g. Alex, Sam>>
- 旅程幣別: <<e.g. JPY>>
- 其他: <<food preferences, mobility, avoid crowds, etc.>>
### 必要的輸出結構
App 只接受包在這個信封裡的單一行程。請回傳外層包裝,不要只回傳內層內容。
{
"format": "com.chrishuang.vacaytrip",
"formatVersion": 1,
"exportedAt": "<<ISO 8601 timestamp, e.g. 2027-01-01T00:00:00.000Z>>",
"app": {
"name": "Vacay Trip Planner",
"version": "1.1",
"build": "1"
},
"trip": {
"trip": {
"...": "title, kicker, subtitle, startDate, endDate, theme, currency — see itinerary.json"
},
"days": [
{
"...": "n、iso、mon、dom、dow、theme、tag、title、items[] 等——請參見 itinerary.json",
"weatherLocation": {
"name": "字串,該天活動所在的城市/地區,例如:'Hanoi'",
"latitude": "數字,城市等級的緯度",
"longitude": "數字,城市等級的經度",
"source": "auto"
}
}
],
"places": [
"... see attached itinerary.json ..."
],
"checklist": [
"... see attached itinerary.json ..."
],
"budget": {
"note": "簡短估價說明,例如:依這些日期查到的常見公開價格",
"target": "以旅程幣別表示的舒適總預算",
"tip": "一則實用花錢提示",
"people": [
{
"id": "person-1",
"name": "旅客 1"
},
{
"id": "person-2",
"name": "旅客 2"
}
],
"expenses": [
{
"id": "expense-1",
"icon": "🏨",
"title": "易讀的支出名稱,例如飯店晚數或交通票證",
"amount": 0,
"currency": "JPY",
"categories": [
"lodging"
],
"paidBy": "person-1",
"split": "equal",
"splitWith": [
"person-1",
"person-2"
],
"shares": {},
"date": "YYYY-MM-DD",
"note": "估價來源,例如:此區典型中價飯店",
"receipts": []
}
]
}
}
}
注意雙層巢狀:外層 trip 是匯入包裝,裡面還有內層 trip(標題/日期)。兩者都叫 trip。不可攤平或改名。欄位名稱必須符合附加的 itinerary.json。可以加天數和項目,但不可改名或刪除必填鍵。
The attached itinerary.json is the app's seed file. Match the inner trip object (planner.trips[0]), especially budget.people and budget.expenses. Do not copy the outer backup wrapper (backupFormat / planner).
### 重要規則
1. 每個必去景點都必須出現在 days[].items 的 activity,或出現在 places[]。
2. 不可捏造特定地點的精確緯度經度、mapURL 或 appleMapsURL,請省略這些欄位。例外:每一天都必須包含 weatherLocation,並填入該天活動實際所在城市/地區(不一定是出發城市)的真實城市級緯度經度。請用知名城市座標(例如河內、東京、湯河原);缺少的話 App 無法顯示當天天氣,並可能持續顯示無關地點的天氣。
3. 不要捏造電話、營業時間或評分。不確定就用空字串 ""。
4. 依節奏偏好平衡觀光日與移動/休息日。
5. 請依目的地、旅行日期/季節,以及 days[] 中實際安排的活動建立檢查清單。只有行程真的有泡溫泉才加入 Onsen 類別;只有季節/地區需要才加入禦寒衣物。請用該地當時的典型氣候知識,不要查即時天氣。
6. 請完全依樣輸出 format、formatVersion 與 trip 包裝。只交內層物件會被 App 拒絕。
7. days[].items[] 的每一項——不論 type(flight、transit、activity、hotel)——都必須有非空的 text:簡短易讀的摘要(例如航班用 BKK → HND,活動用地點名稱,飯店用飯店名稱)。缺少 text 會被 App 拒絕。
8. 只回傳 JSON 物件。
9. 若列出已預訂飯店,代表已經訂好:不可更改、替換或省略。請在入住當天的 days[].items 加入 type 為 hotel 的項目,text 使用指定飯店名稱。每天觀光請以當晚飯店所在城市/地區為據點。僅能為尚未被預訂覆蓋的晚上另外建議飯店。若未列出,則依住宿偏好選擇。
10. 必須包含 trip.budget,並填 people(每位旅客一筆)與 expenses(旅程錢包)。不要使用舊的 budget.rows。receipts 請留 []。paidBy 與 splitWith 必須對應 budget.people 的 id。categories 只能是:food, drinks, transport, lodging, tickets, shopping, groceries, activities, fees, gifts, health, other。
11. 請用網路搜尋或瀏覽查詢此目的地與日期的現行公開行情:中價住宿(若已列出預訂飯店則用該飯店)、當地交通、行程中的長途火車或巴士、景點票券、以及典型餐費。每筆費用以旅程幣別的數字寫入 budget.expenses。在每筆支出的 note 寫簡短來源或假設。若無法上網,請用廣為人知的 2026–2027 公開價格區間,並在 budget.note 說明。不要捏造電話、訂房編號或收據照片。
12. 旅客 2 人以上時:住宿、共用交通、全員參加的活動使用 split="equal",splitWith 為所有旅客 id(團體支出)。可選的個人額外支出用 split="payer"(私人)。僅 1 人時用 split="payer" 即可。除非使用者要求,否則不要捏造購物或伴手禮總額。除非使用者要求列入,否則省略國際機票;若列入,請用典型價格區間並註明為估價。
简体中文 (Simplified Chinese)
你正在生成一份可直接导入 Vacay Trip Planner 的 JSON 行程。只输出有效 JSON——不要说明、不要 Markdown 代码块。
所有给人看的行程文字请用这个语言撰写: 简体中文
### 行程条件
- 目的地: <<e.g. Tokyo + Yugawara>>
- 开始日期: <<YYYY-MM-DD>>
- 结束日期: <<YYYY-MM-DD>>
- 出发城市或机场: <<e.g. Bangkok BKK>>
- 必去景点: <<list>>
- 节奏偏好: <<e.g. 2 full sightseeing days, light travel days at the start and end>>
- 住宿偏好: <<e.g. one hotel for the whole trip, prefer Ueno — for nights not already booked>>
- 已预订酒店: <<e.g. APA Hotel Asakusa, Tokyo, check-in 2027-03-12, check-out 2027-03-16. Write none if you have not booked yet>>
- 旅客人数: <<e.g. 2>>
- 旅客姓名(选填): <<e.g. Alex, Sam>>
- 行程货币: <<e.g. JPY>>
- 其他: <<food preferences, mobility, avoid crowds, etc.>>
### 必需的输出结构
应用只接受包在这个信封里的单次行程。请返回外层包装,不要只返回内层内容。
{
"format": "com.chrishuang.vacaytrip",
"formatVersion": 1,
"exportedAt": "<<ISO 8601 timestamp, e.g. 2027-01-01T00:00:00.000Z>>",
"app": {
"name": "Vacay Trip Planner",
"version": "1.1",
"build": "1"
},
"trip": {
"trip": {
"...": "title, kicker, subtitle, startDate, endDate, theme, currency — see itinerary.json"
},
"days": [
{
"...": "n、iso、mon、dom、dow、theme、tag、title、items[] 等——请参见 itinerary.json",
"weatherLocation": {
"name": "字符串,该天活动所在的城市/地区,例如 'Hanoi'",
"latitude": "数字,城市级别的纬度",
"longitude": "数字,城市级别的经度",
"source": "auto"
}
}
],
"places": [
"... see attached itinerary.json ..."
],
"checklist": [
"... see attached itinerary.json ..."
],
"budget": {
"note": "简短估价说明,例如:按这些日期查到的常见公开价格",
"target": "以行程货币表示的舒适总预算",
"tip": "一则实用花钱提示",
"people": [
{
"id": "person-1",
"name": "旅客 1"
},
{
"id": "person-2",
"name": "旅客 2"
}
],
"expenses": [
{
"id": "expense-1",
"icon": "🏨",
"title": "易读的支出名称,例如酒店晚数或交通票证",
"amount": 0,
"currency": "JPY",
"categories": [
"lodging"
],
"paidBy": "person-1",
"split": "equal",
"splitWith": [
"person-1",
"person-2"
],
"shares": {},
"date": "YYYY-MM-DD",
"note": "估价来源,例如:此区典型中价酒店",
"receipts": []
}
]
}
}
}
注意双层嵌套:外层 trip 是导入包装,里面还有内层 trip(标题/日期)。两者都叫 trip。不可拍平或改名。字段名必须符合附加的 itinerary.json。可以加天数和项目,但不可改名或删除必填键。
The attached itinerary.json is the app's seed file. Match the inner trip object (planner.trips[0]), especially budget.people and budget.expenses. Do not copy the outer backup wrapper (backupFormat / planner).
### 重要规则
1. 每个必去景点都必须出现在 days[].items 的 activity,或出现在 places[]。
2. 不可编造特定地点的精确纬度经度、mapURL 或 appleMapsURL,请省略这些字段。例外:每一天都必须包含 weatherLocation,并填入该天活动实际所在城市/地区(不一定是出发城市)的真实城市级纬度经度。请用知名城市坐标(例如河内、东京、汤河原);缺少的话应用无法显示当天天气,并可能持续显示无关地点的天气。
3. 不要编造电话、营业时间或评分。不确定就用空字符串 ""。
4. 按节奏偏好平衡观光日与移动/休息日。
5. 请按目的地、旅行日期/季节,以及 days[] 中实际安排的活动建立检查清单。只有行程真的有泡温泉才加入 Onsen 分类;只有季节/地区需要才加入保暖衣物。请用该地当时的典型气候知识,不要查实时天气。
6. 请完全按样输出 format、formatVersion 与 trip 包装。只交内层对象会被应用拒绝。
7. days[].items[] 的每一项——不论 type(flight、transit、activity、hotel)——都必须有非空的 text:简短易读的摘要(例如航班用 BKK → HND,活动用地点名称,酒店用酒店名称)。缺少 text 会被应用拒绝。
8. 只返回 JSON 对象。
9. 若列出已预订酒店,代表已经订好:不可更改、替换或省略。请在入住当天的 days[].items 加入 type 为 hotel 的项目,text 使用指定的酒店名称。每天观光请以当晚酒店所在城市/地区为据点。仅能为尚未被预订覆盖的晚上另外建议酒店。若未列出,则按住宿偏好选择。
10. 必须包含 trip.budget,并填 people(每位旅客一笔)与 expenses(行程钱包)。不要使用旧的 budget.rows。receipts 请留 []。paidBy 与 splitWith 必须对应 budget.people 的 id。categories 只能是:food, drinks, transport, lodging, tickets, shopping, groceries, activities, fees, gifts, health, other。
11. 请用网络搜索或浏览查询此目的地与日期的现行公开行情:中价住宿(若已列出预订酒店则用该酒店)、当地交通、行程中的长途火车或巴士、景点票券、以及典型餐费。每笔费用以行程货币的数字写入 budget.expenses。在每笔支出的 note 写简短来源或假设。若无法上网,请用广为人知的 2026–2027 公开价格区间,并在 budget.note 说明。不要编造电话、订房编号或收据照片。
12. 旅客 2 人以上时:住宿、共用交通、全员参加的活动使用 split="equal",splitWith 为所有旅客 id(团体支出)。可选的个人额外支出用 split="payer"(私人)。仅 1 人时用 split="payer" 即可。除非用户要求,否则不要编造购物或伴手礼总额。除非用户要求列入,否则省略国际机票;若列入,请用典型价格区间并注明为估价。
Русский (Russian)
Вы создаёте маршрут как JSON для прямого импорта в Vacay Trip Planner. Выводите только корректный JSON — без текста и блоков кода.
Весь читаемый текст маршрута пишите на этом языке: Русский
### Детали поездки
- Направление: <<e.g. Tokyo + Yugawara>>
- Дата начала: <<YYYY-MM-DD>>
- Дата окончания: <<YYYY-MM-DD>>
- Город или аэропорт вылета: <<e.g. Bangkok BKK>>
- Обязательные места: <<list>>
- Предпочтение по темпу: <<e.g. 2 full sightseeing days, light travel days at the start and end>>
- Предпочтение по жилью: <<e.g. one hotel for the whole trip, prefer Ueno — for nights not already booked>>
- Забронированные отели: <<e.g. APA Hotel Asakusa, Tokyo, check-in 2027-03-12, check-out 2027-03-16. Write none if you have not booked yet>>
- Число путешественников: <<e.g. 2>>
- Имена (необязательно): <<e.g. Alex, Sam>>
- Валюта поездки: <<e.g. JPY>>
- Другое: <<food preferences, mobility, avoid crowds, etc.>>
### Требуемая схема вывода
Приложение принимает только одну поездку в этом конверте. Верните внешнюю обёртку, не только внутреннее содержимое.
{
"format": "com.chrishuang.vacaytrip",
"formatVersion": 1,
"exportedAt": "<<ISO 8601 timestamp, e.g. 2027-01-01T00:00:00.000Z>>",
"app": {
"name": "Vacay Trip Planner",
"version": "1.1",
"build": "1"
},
"trip": {
"trip": {
"...": "title, kicker, subtitle, startDate, endDate, theme, currency — see itinerary.json"
},
"days": [
{
"...": "n, iso, mon, dom, dow, theme, tag, title, items[] и т.д. — см. itinerary.json",
"weatherLocation": {
"name": "строка, город/район, в котором проходит этот день, напр. 'Hanoi'",
"latitude": "число, широта на уровне города",
"longitude": "число, долгота на уровне города",
"source": "auto"
}
}
],
"places": [
"... see attached itinerary.json ..."
],
"checklist": [
"... see attached itinerary.json ..."
],
"budget": {
"note": "Краткий дисклеймер оценки, напр. типичные публичные цены на эти даты",
"target": "Комфортная сумма поездки в валюте поездки",
"tip": "Один практичный совет по деньгам",
"people": [
{
"id": "person-1",
"name": "Путешественник 1"
},
{
"id": "person-2",
"name": "Путешественник 2"
}
],
"expenses": [
{
"id": "expense-1",
"icon": "🏨",
"title": "Понятное название расхода, напр. ночи в отеле или проездной",
"amount": 0,
"currency": "JPY",
"categories": [
"lodging"
],
"paidBy": "person-1",
"split": "equal",
"splitWith": [
"person-1",
"person-2"
],
"shares": {},
"date": "YYYY-MM-DD",
"note": "Откуда оценка, напр. типичный отель среднего класса в этом районе",
"receipts": []
}
]
}
}
}
Двойная вложенность: внешний trip — обёртка импорта, внутри свой trip (название/даты). Оба специально называются trip. Не сглаживайте и не переименовывайте. Имена полей — как в приложенном itinerary.json. Дни и пункты можно добавлять, обязательные ключи нельзя переименовывать или удалять.
The attached itinerary.json is the app's seed file. Match the inner trip object (planner.trips[0]), especially budget.people and budget.expenses. Do not copy the outer backup wrapper (backupFormat / planner).
### Важные правила
1. Каждое обязательное место должно быть activity в days[].items или в places[].
2. Не выдумывайте точные latitude/longitude, mapURL или appleMapsURL для конкретных мест — опустите эти поля. ИСКЛЮЧЕНИЕ: каждый день ОБЯЗАН включать weatherLocation с реальными городскими latitude/longitude для города/района, где проходят дела этого дня (не обязательно город вылета). Используйте координаты известных городов (напр. Ханой, Токио, Югавара); без них приложение не покажет погоду за день и может показывать погоду другого места.
3. Не выдумывайте телефоны, часы работы и рейтинги. Лучше пустая строка "".
4. Сбалансируйте дни осмотра и дни в пути/отдыха по предпочтению темпа.
5. Соберите checklist по направлению, датам/сезону и конкретным делам в days[]. Группу Onsen добавляйте только если онсэн есть в маршруте; тёплую одежду — только если этого требует сезон/регион. Используйте типичный климат; не запрашивайте погоду онлайн.
6. Выведите format, formatVersion и обёртку trip как показано. Голый внутренний объект приложение отклонит.
7. Каждый элемент days[].items[] — независимо от type (flight, transit, activity, hotel) — должен иметь непустое поле text: краткое резюме (напр. BKK → HND для рейса, название места для дела, название отеля). Без text приложение отклонит файл.
8. Верните только JSON-объект.
9. Если указаны забронированные отели, они уже забронированы: не меняйте, не заменяйте и не пропускайте. Добавьте каждый как hotel в день заезда в days[].items, имя отеля — в text. Планируйте осмотр вокруг города/района отеля на эту ночь. Дополнительные отели — только на ночи без брони. Если ничего нет, выбирайте жильё по предпочтению.
10. Всегда включайте trip.budget с people (по одному объекту на человека) и expenses (кошелёк поездки). Не используйте устаревшую таблицу budget.rows. receipts оставьте []. paidBy и splitWith должны совпадать с id в budget.people. categories только из: food, drinks, transport, lodging, tickets, shopping, groceries, activities, fees, gifts, health, other.
11. Используйте веб-поиск или просмотр, чтобы найти типичные текущие публичные цены для этого направления и дат: жильё среднего класса (или указанный забронированный отель), местный транспорт, поезда/автобусы дальнего следования в маршруте, билеты на достопримечательности и типичное питание. Каждую сумму запишите числом в валюте поездки в budget.expenses. В note каждого расхода укажите краткий источник или допущение. Если просмотр недоступен, используйте известные публичные диапазоны 2026–2027 и укажите это в budget.note. Не выдумывайте телефоны, номера брони и фото чеков.
12. Если путешественников 2+: жильё, общий транспорт и занятия для всех — split="equal" и splitWith=все id (групповые расходы). Личные необязательные траты — split="payer" (личное). Для 1 человека split="payer" достаточно. Не выдумывайте шопинг и сувениры, если пользователь не просил. Международные авиабилеты не включайте, если не просили; если включаете — типичный диапазон и пометка, что это оценка.
Español (Spanish)
Estás generando un itinerario JSON para importar en Vacay Trip Planner. Devuelve solo JSON válido, sin texto ni bloques markdown.
Escribe todo el texto legible del itinerario en este idioma: Español
### Detalles del viaje
- Destino(s): <<e.g. Tokyo + Yugawara>>
- Fecha de inicio: <<YYYY-MM-DD>>
- Fecha de fin: <<YYYY-MM-DD>>
- Ciudad o aeropuerto de origen: <<e.g. Bangkok BKK>>
- Lugares imprescindibles: <<list>>
- Preferencia de ritmo: <<e.g. 2 full sightseeing days, light travel days at the start and end>>
- Preferencia de alojamiento: <<e.g. one hotel for the whole trip, prefer Ueno — for nights not already booked>>
- Hoteles reservados: <<e.g. APA Hotel Asakusa, Tokyo, check-in 2027-03-12, check-out 2027-03-16. Write none if you have not booked yet>>
- Número de viajeros: <<e.g. 2>>
- Nombres de viajeros (opcional): <<e.g. Alex, Sam>>
- Moneda del viaje: <<e.g. JPY>>
- Cualquier otra cosa: <<food preferences, mobility, avoid crowds, etc.>>
### Esquema de salida requerido
La app solo acepta un viaje envuelto en este sobre. Devuelve el envoltorio exterior, no solo el contenido interior.
{
"format": "com.chrishuang.vacaytrip",
"formatVersion": 1,
"exportedAt": "<<ISO 8601 timestamp, e.g. 2027-01-01T00:00:00.000Z>>",
"app": {
"name": "Vacay Trip Planner",
"version": "1.1",
"build": "1"
},
"trip": {
"trip": {
"...": "title, kicker, subtitle, startDate, endDate, theme, currency — see itinerary.json"
},
"days": [
{
"...": "n, iso, mon, dom, dow, theme, tag, title, items[], etc. — ver itinerary.json",
"weatherLocation": {
"name": "cadena, la ciudad/zona en la que transcurre ese día, p. ej. 'Hanoi'",
"latitude": "número, latitud a nivel de ciudad",
"longitude": "número, longitud a nivel de ciudad",
"source": "auto"
}
}
],
"places": [
"... see attached itinerary.json ..."
],
"checklist": [
"... see attached itinerary.json ..."
],
"budget": {
"note": "Aviso breve de estimación, p. ej. precios públicos típicos para estas fechas",
"target": "Total cómodo del viaje en la moneda del viaje",
"tip": "Un consejo práctico de dinero",
"people": [
{
"id": "person-1",
"name": "Viajero 1"
},
{
"id": "person-2",
"name": "Viajero 2"
}
],
"expenses": [
{
"id": "expense-1",
"icon": "🏨",
"title": "Nombre legible del gasto, p. ej. noches de hotel o abono de transporte",
"amount": 0,
"currency": "JPY",
"categories": [
"lodging"
],
"paidBy": "person-1",
"split": "equal",
"splitWith": [
"person-1",
"person-2"
],
"shares": {},
"date": "YYYY-MM-DD",
"note": "De dónde sale la estimación, p. ej. hotel de gama media típico en esta zona",
"receipts": []
}
]
}
}
}
Observa el anidamiento doble: el trip exterior es el envoltorio de importación y contiene otro trip (título/fechas). Ambos se llaman trip a propósito. No aplanes ni renombres. Los campos deben coincidir con itinerary.json. Puedes añadir días y elementos, pero no renombres ni elimines claves obligatorias.
The attached itinerary.json is the app's seed file. Match the inner trip object (planner.trips[0]), especially budget.people and budget.expenses. Do not copy the outer backup wrapper (backupFormat / planner).
### Reglas importantes
1. Cada lugar imprescindible debe aparecer como activity en days[].items o en places[].
2. No inventes latitude/longitude, mapURL ni appleMapsURL de lugares concretos. Omite esos campos. EXCEPCIÓN: cada día DEBE incluir weatherLocation con latitude/longitude reales a nivel de ciudad para la ciudad/zona de las actividades de ese día (no necesariamente la de origen). Usa coordenadas de ciudades conocidas (p. ej. Hanói, Tokio, Yugawara); sin ello la app no puede mostrar el clima de ese día.
3. No inventes teléfonos, horarios ni valoraciones. Usa una cadena vacía "" en lugar de adivinar.
4. Equilibra días de visitas frente a viaje y descanso según el ritmo.
5. Crea la checklist según destino, fechas/temporada y las actividades concretas de days[]. Añade un grupo Onsen solo si hay visita a aguas termales; prendas de frío solo si la temporada/región lo requiere. Usa el clima típico; no consultes el tiempo en vivo.
6. Genera format, formatVersion y el envoltorio trip tal cual. La app rechaza un objeto interior suelto.
7. Cada elemento de days[].items[] — sea type flight, transit, activity o hotel — debe incluir un text no vacío: un resumen breve (p. ej. BKK → HND para un vuelo, el nombre del lugar o del hotel). Sin text la app lo rechaza.
8. Devuelve únicamente el objeto JSON.
9. Si hay hoteles reservados, ya están reservados: no los cambies, sustituyas ni omitas. Añade cada uno como hotel el día de entrada en days[].items, con el nombre dado en text. Planifica las visitas en torno a la ciudad/zona del hotel de esa noche. Sugiere más hoteles solo para noches no cubiertas. Si no hay ninguno, elige según la preferencia de alojamiento.
10. Incluye siempre trip.budget con people (un objeto por viajero) y expenses (la cartera del viaje). No uses la tabla antigua budget.rows. Deja receipts como []. paidBy y splitWith deben coincidir con los id de budget.people. Las categories deben ser: food, drinks, transport, lodging, tickets, shopping, groceries, activities, fees, gifts, health, other.
11. Usa búsqueda web o navegación para consultar precios públicos actuales típicos de este destino y fechas: alojamiento de gama media (o el hotel reservado si está indicado), transporte local, trenes o autobuses de larga distancia del itinerario, entradas y comidas típicas. Pon cada coste en budget.expenses como número en la moneda del viaje. Escribe una fuente o supuesto breve en el note de cada gasto. Si no puedes navegar, usa rangos públicos conocidos de 2026–2027 y dilo en budget.note. No inventes teléfonos, IDs de reserva ni fotos de recibos.
12. Con 2 o más viajeros: alojamiento, transporte compartido y actividades de todos usan split="equal" y splitWith=todos los id (gastos de grupo). Extras personales opcionales usan split="payer" (privado). Con 1 viajero, split="payer" vale. No inventes compras ni souvenirs salvo que lo pidan. Omite el vuelo internacional salvo que lo pidan; si lo incluyes, usa un rango típico y di que es una estimación.
Italiano (Italian)
Stai generando un itinerario JSON da importare in Vacay Trip Planner. Restituisci solo JSON valido, senza testo né blocchi markdown.
Scrivi tutto il testo leggibile dell'itinerario in questa lingua: Italiano
### Dettagli del viaggio
- Destinazione/i: <<e.g. Tokyo + Yugawara>>
- Data di inizio: <<YYYY-MM-DD>>
- Data di fine: <<YYYY-MM-DD>>
- Città o aeroporto di partenza: <<e.g. Bangkok BKK>>
- Luoghi da non perdere: <<list>>
- Preferenza di ritmo: <<e.g. 2 full sightseeing days, light travel days at the start and end>>
- Preferenza di alloggio: <<e.g. one hotel for the whole trip, prefer Ueno — for nights not already booked>>
- Hotel già prenotati: <<e.g. APA Hotel Asakusa, Tokyo, check-in 2027-03-12, check-out 2027-03-16. Write none if you have not booked yet>>
- Numero di viaggiatori: <<e.g. 2>>
- Nomi dei viaggiatori (facoltativo): <<e.g. Alex, Sam>>
- Valuta del viaggio: <<e.g. JPY>>
- Altro: <<food preferences, mobility, avoid crowds, etc.>>
### Schema di output richiesto
L'app accetta solo un viaggio racchiuso in questo involucro. Restituisci l'involucro esterno, non solo il contenuto interno.
{
"format": "com.chrishuang.vacaytrip",
"formatVersion": 1,
"exportedAt": "<<ISO 8601 timestamp, e.g. 2027-01-01T00:00:00.000Z>>",
"app": {
"name": "Vacay Trip Planner",
"version": "1.1",
"build": "1"
},
"trip": {
"trip": {
"...": "title, kicker, subtitle, startDate, endDate, theme, currency — see itinerary.json"
},
"days": [
{
"...": "n, iso, mon, dom, dow, theme, tag, title, items[], ecc. — vedi itinerary.json",
"weatherLocation": {
"name": "stringa, la città/zona in cui si svolge quella giornata, es. 'Hanoi'",
"latitude": "numero, latitudine a livello di città",
"longitude": "numero, longitudine a livello di città",
"source": "auto"
}
}
],
"places": [
"... see attached itinerary.json ..."
],
"checklist": [
"... see attached itinerary.json ..."
],
"budget": {
"note": "Breve nota di stima, es. prezzi pubblici tipici per queste date",
"target": "Totale confortevole del viaggio nella valuta del viaggio",
"tip": "Un consiglio pratico sul denaro",
"people": [
{
"id": "person-1",
"name": "Viaggiatore 1"
},
{
"id": "person-2",
"name": "Viaggiatore 2"
}
],
"expenses": [
{
"id": "expense-1",
"icon": "🏨",
"title": "Nome leggibile della spesa, es. notti in hotel o tessera trasporti",
"amount": 0,
"currency": "JPY",
"categories": [
"lodging"
],
"paidBy": "person-1",
"split": "equal",
"splitWith": [
"person-1",
"person-2"
],
"shares": {},
"date": "YYYY-MM-DD",
"note": "Origine della stima, es. hotel di fascia media tipico in questa zona",
"receipts": []
}
]
}
}
}
Nota il doppio annidamento: il trip esterno è l'involucro di importazione e contiene un altro trip (titolo/date). Entrambi si chiamano trip di proposito. Non appiattire né rinominare. I campi devono coincidere con itinerary.json. Puoi aggiungere giorni ed elementi, ma non rinominare o rimuovere chiavi obbligatorie.
The attached itinerary.json is the app's seed file. Match the inner trip object (planner.trips[0]), especially budget.people and budget.expenses. Do not copy the outer backup wrapper (backupFormat / planner).
### Regole importanti
1. Ogni luogo da non perdere deve comparire come activity in days[].items o in places[].
2. Non inventare latitude/longitude, mapURL o appleMapsURL per luoghi specifici. Ometti questi campi. ECCEZIONE: ogni giorno DEVE includere weatherLocation con latitude/longitude reali a livello di città per la città/zona di quel giorno (non necessariamente quella di partenza). Usa le coordinate di città note (es. Hanoi, Tokyo, Yugawara); senza di esse l'app non può mostrare il meteo di quel giorno.
3. Non inventare telefoni, orari o valutazioni. Usa una stringa vuota "" invece di indovinare.
4. Bilancia i giorni di visite rispetto a viaggio e riposo secondo il ritmo.
5. Crea la checklist da destinazione, date/stagione e attività specifiche in days[]. Aggiungi un gruppo Onsen solo se c'è una visita alle terme; capi per il freddo solo se stagione/regione lo richiedono. Usa il clima tipico; non recuperare il meteo in tempo reale.
6. Genera format, formatVersion e l'involucro trip come mostrato. L'app rifiuta un oggetto interno nudo.
7. Ogni elemento di days[].items[] — qualunque type (flight, transit, activity, hotel) — deve avere un campo text non vuoto: un breve riepilogo (es. BKK → HND per un volo, il nome del luogo o dell'hotel). Senza text l'app lo rifiuta.
8. Restituisci solo l'oggetto JSON.
9. Se sono elencati hotel già prenotati, sono già prenotati: non cambiarli, sostituirli o ometterli. Aggiungi ciascuno come hotel nel giorno del check-in in days[].items, con il nome dato in text. Pianifica le visite intorno alla città/zona dell'hotel di quella notte. Suggerisci altri hotel solo per le notti non coperte. Se non ce ne sono, scegli in base alla preferenza di alloggio.
10. Includi sempre trip.budget con people (un oggetto per viaggiatore) ed expenses (il portafoglio di viaggio). Non usare la vecchia tabella budget.rows. Lascia receipts come []. paidBy e splitWith devono coincidere con gli id di budget.people. Le categories devono essere: food, drinks, transport, lodging, tickets, shopping, groceries, activities, fees, gifts, health, other.
11. Usa la ricerca web o la navigazione per trovare prezzi pubblici attuali tipici per questa destinazione e queste date: alloggio di fascia media (o l'hotel prenotato se indicato), trasporti locali, treni o bus a lunga percorrenza nell'itinerario, biglietti e pasti tipici. Metti ogni costo in budget.expenses come numero nella valuta del viaggio. Scrivi una fonte o un'ipotesi breve nella note di ogni spesa. Se non puoi navigare, usa fasce di prezzi pubblici note del 2026–2027 e indicarlo in budget.note. Non inventare telefoni, ID di prenotazione o foto di scontrini.
12. Con 2 o più viaggiatori: alloggio, trasporti condivisi e attività di tutti usano split="equal" e splitWith=tutti gli id (spese di gruppo). Extra personali opzionali usano split="payer" (privato). Con 1 viaggiatore, split="payer" va bene. Non inventare shopping o souvenir se non richiesto. Ometti il volo internazionale se non richiesto; se lo includi, usa una fascia tipica e indica che è una stima.
Français (French)
Vous générez un itinéraire JSON à importer dans Vacay Trip Planner. Produisez uniquement du JSON valide, sans texte ni blocs markdown.
Rédigez tout le texte lisible de l'itinéraire dans cette langue : Français
### Détails du voyage
- Destination(s): <<e.g. Tokyo + Yugawara>>
- Date de début: <<YYYY-MM-DD>>
- Date de fin: <<YYYY-MM-DD>>
- Ville ou aéroport de départ: <<e.g. Bangkok BKK>>
- Lieux incontournables: <<list>>
- Préférence de rythme: <<e.g. 2 full sightseeing days, light travel days at the start and end>>
- Préférence d'hébergement: <<e.g. one hotel for the whole trip, prefer Ueno — for nights not already booked>>
- Hôtels déjà réservés: <<e.g. APA Hotel Asakusa, Tokyo, check-in 2027-03-12, check-out 2027-03-16. Write none if you have not booked yet>>
- Nombre de voyageurs: <<e.g. 2>>
- Noms des voyageurs (facultatif): <<e.g. Alex, Sam>>
- Devise du voyage: <<e.g. JPY>>
- Autre chose: <<food preferences, mobility, avoid crowds, etc.>>
### Schéma de sortie requis
L'app n'accepte qu'un voyage dans cette enveloppe. Renvoyez l'enveloppe externe, pas seulement le contenu interne.
{
"format": "com.chrishuang.vacaytrip",
"formatVersion": 1,
"exportedAt": "<<ISO 8601 timestamp, e.g. 2027-01-01T00:00:00.000Z>>",
"app": {
"name": "Vacay Trip Planner",
"version": "1.1",
"build": "1"
},
"trip": {
"trip": {
"...": "title, kicker, subtitle, startDate, endDate, theme, currency — see itinerary.json"
},
"days": [
{
"...": "n, iso, mon, dom, dow, theme, tag, title, items[], etc. — voir itinerary.json",
"weatherLocation": {
"name": "chaîne, la ville/région où se déroule cette journée, ex. 'Hanoi'",
"latitude": "nombre, latitude au niveau de la ville",
"longitude": "nombre, longitude au niveau de la ville",
"source": "auto"
}
}
],
"places": [
"... see attached itinerary.json ..."
],
"checklist": [
"... see attached itinerary.json ..."
],
"budget": {
"note": "Court avertissement d'estimation, ex. prix publics typiques pour ces dates",
"target": "Total confortable du voyage dans la devise du voyage",
"tip": "Un conseil pratique d'argent",
"people": [
{
"id": "person-1",
"name": "Voyageur 1"
},
{
"id": "person-2",
"name": "Voyageur 2"
}
],
"expenses": [
{
"id": "expense-1",
"icon": "🏨",
"title": "Nom lisible de la dépense, ex. nuits d'hôtel ou pass transport",
"amount": 0,
"currency": "JPY",
"categories": [
"lodging"
],
"paidBy": "person-1",
"split": "equal",
"splitWith": [
"person-1",
"person-2"
],
"shares": {},
"date": "YYYY-MM-DD",
"note": "Origine de l'estimation, ex. hôtel milieu de gamme typique dans ce quartier",
"receipts": []
}
]
}
}
}
Notez le double imbriquement : le trip externe est l'enveloppe d'import et contient un autre trip (titre/dates). Les deux s'appellent trip exprès. N'aplatissez ni ne renommez. Les champs doivent correspondre à itinerary.json. Vous pouvez ajouter des jours et des éléments, mais pas renommer ni supprimer les clés obligatoires.
The attached itinerary.json is the app's seed file. Match the inner trip object (planner.trips[0]), especially budget.people and budget.expenses. Do not copy the outer backup wrapper (backupFormat / planner).
### Règles importantes
1. Chaque lieu incontournable doit apparaître comme activity dans days[].items ou dans places[].
2. N'inventez pas de latitude/longitude, mapURL ou appleMapsURL pour des lieux précis. Omettez ces champs. EXCEPTION : chaque jour DOIT inclure un weatherLocation avec des latitude/longitude réelles au niveau de la ville pour la ville/région de cette journée (pas forcément la ville d'origine). Utilisez les coordonnées de villes connues (ex. Hanoï, Tokyo, Yugawara) ; sinon l'app ne pourra pas afficher la météo du jour.
3. N'inventez pas de téléphones, horaires ou notes. Utilisez une chaîne vide "" au lieu de deviner.
4. Équilibrez visites et jours de trajet/repos selon le rythme.
5. Construisez la checklist selon la destination, les dates/saison et les activités prévues dans days[]. N'ajoutez un groupe Onsen que s'il y a une visite d'onsen ; des couches pour le froid seulement si la saison/région l'exige. Utilisez le climat typique ; ne consultez pas la météo en direct.
6. Générez format, formatVersion et l'enveloppe trip tels quels. L'app refuse un objet interne seul.
7. Chaque élément de days[].items[] — quel que soit le type (flight, transit, activity, hotel) — doit inclure un text non vide : un résumé court (ex. BKK → HND pour un vol, le nom du lieu ou de l'hôtel). Sans text, l'app le refuse.
8. Renvoyez uniquement l'objet JSON.
9. Si des hôtels déjà réservés sont listés, ils sont déjà réservés : ne les changez pas, ne les remplacez pas et ne les omettez pas. Ajoutez chacun comme hotel le jour d'arrivée dans days[].items, avec le nom donné dans text. Planifiez les visites autour de la ville/région de l'hôtel cette nuit-là. Ne proposez d'autres hôtels que pour les nuits non couvertes. S'il n'y en a pas, choisissez selon la préférence d'hébergement.
10. Incluez toujours trip.budget avec people (un objet par voyageur) et expenses (le portefeuille du voyage). N'utilisez pas l'ancienne table budget.rows. Laissez receipts à []. paidBy et splitWith doivent correspondre aux id de budget.people. Les categories doivent être : food, drinks, transport, lodging, tickets, shopping, groceries, activities, fees, gifts, health, other.
11. Utilisez la recherche web ou la navigation pour trouver des prix publics actuels typiques pour cette destination et ces dates : hébergement milieu de gamme (ou l'hôtel réservé s'il est indiqué), transports locaux, trains ou bus longue distance de l'itinéraire, billets d'attractions et repas typiques. Placez chaque coût dans budget.expenses comme nombre dans la devise du voyage. Indiquez une source ou une hypothèse courte dans la note de chaque dépense. Si vous ne pouvez pas naviguer, utilisez des fourchettes publiques connues 2026–2027 et dites-le dans budget.note. N'inventez pas de téléphones, d'identifiants de réservation ni de photos de reçus.
12. Avec 2 voyageurs ou plus : l'hébergement, les transports partagés et les activités de tout le monde utilisent split="equal" et splitWith=tous les id (dépenses de groupe). Les extras personnels facultatifs utilisent split="payer" (privé). Avec 1 voyageur, split="payer" convient. N'inventez pas de shopping ni de souvenirs sauf demande. Omettez le vol international sauf demande ; s'il est inclus, utilisez une fourchette typique et indiquez que c'est une estimation.
After you get the result
- Paste the AI's JSON output into a new file, e.g.
draft-itinerary.json. - Open the app → Settings → 📦 JSON and Markdown backup and import.
- Tap Validate JSON and pick your file first to check it is well-formed.
- Tap Import itinerary and pick your JSON file to add it alongside your existing trips.
If import fails, the app validates that the JSON's format field matches what it expects — check that the AI did not add or rename any top-level keys outside of what the prompt asked for.