182 lines
8.3 KiB
JSON
182 lines
8.3 KiB
JSON
{
|
|
"reporting": {
|
|
"latestReport": "price-watch/latest-report.md",
|
|
"historyLog": "price-watch/history.jsonl"
|
|
},
|
|
"comparison": {
|
|
"materialPriceChangeUsd": 100,
|
|
"highlightNewOptions": true,
|
|
"markLoginRequiredSources": true
|
|
},
|
|
"tripDates": {
|
|
"checkIn": "2027-02-03",
|
|
"checkOut": "2027-02-07",
|
|
"nights": 4,
|
|
"note": "All per-night or per-day rates should be converted to the full check-in/check-out total for comparison, while preserving the unit rate in the display label."
|
|
},
|
|
"trackedSources": [
|
|
{
|
|
"id": "hotel-packages",
|
|
"label": "Flight + Hotel Packages",
|
|
"categories": ["hotel"],
|
|
"bookingType": "package",
|
|
"requiredChecks": [
|
|
"Costco Travel package results",
|
|
"Apple Vacations package search",
|
|
"CheapCaribbean package search",
|
|
"other date-matched package providers found during research"
|
|
]
|
|
},
|
|
{
|
|
"id": "standalone-hotels",
|
|
"label": "Standalone Hotels",
|
|
"categories": ["hotel"],
|
|
"bookingType": "standalone",
|
|
"requiredChecks": [
|
|
"KAYAK hotel search",
|
|
"official hotel booking engine when public rates are visible",
|
|
"other OTA hotel-only rates found during research"
|
|
]
|
|
},
|
|
{
|
|
"id": "flights",
|
|
"label": "Standalone Flights",
|
|
"categories": ["flight"],
|
|
"bookingType": "standalone",
|
|
"requiredChecks": [
|
|
"LAX to SJD date-matched round trip on airline and travel sites",
|
|
"ONT to SJD date-matched round trip on airline and travel sites",
|
|
"Google Flights exact-date search",
|
|
"KAYAK exact-date flight search",
|
|
"airline direct-booking results when publicly visible",
|
|
"capture airline, stops, schedule window, baggage caveats, and total price per traveler"
|
|
]
|
|
},
|
|
{
|
|
"id": "golf",
|
|
"label": "Golf",
|
|
"categories": ["golf"],
|
|
"bookingType": "standalone",
|
|
"requiredChecks": [
|
|
"official course tee-time pages when available",
|
|
"public tee-time marketplaces",
|
|
"resort/package golf inclusions when attached to hotel packages"
|
|
]
|
|
},
|
|
{
|
|
"id": "nightlife",
|
|
"label": "Nightlife and Day Clubs",
|
|
"categories": ["nightlife"],
|
|
"bookingType": "standalone",
|
|
"requiredChecks": [
|
|
"VIP table packages",
|
|
"bottle service minimums",
|
|
"day-club and beach-club package pricing",
|
|
"cover charges or ticketed events when visible"
|
|
]
|
|
},
|
|
{
|
|
"id": "excursions",
|
|
"label": "Excursions and Water Activities",
|
|
"categories": ["excursion"],
|
|
"bookingType": "standalone",
|
|
"requiredChecks": [
|
|
"yacht and private charter quotes",
|
|
"whale-watch and sunset sail pricing",
|
|
"ATV/off-road packages",
|
|
"bachelor-party-relevant group excursions"
|
|
]
|
|
},
|
|
{
|
|
"id": "derived-itineraries",
|
|
"label": "Derived Itineraries",
|
|
"categories": ["itinerary"],
|
|
"bookingType": "calculated",
|
|
"requiredChecks": [
|
|
"recalculate budget, balanced, and splurge itinerary totals from the current hotel/package, flight, golf, nightlife, and excursion results",
|
|
"include component breakdowns and assumptions for each itinerary"
|
|
]
|
|
},
|
|
{
|
|
"id": "derived-budgets",
|
|
"label": "Derived Budget Tracks",
|
|
"categories": ["budget"],
|
|
"bookingType": "calculated",
|
|
"requiredChecks": [
|
|
"recalculate 8, 10, and 12 person totals from current results",
|
|
"prefer exact package prices when the itinerary uses a flight+hotel package",
|
|
"avoid double-counting flights or hotels already included in package prices",
|
|
"include per-person and group-total math plus assumptions"
|
|
]
|
|
}
|
|
],
|
|
"bookingTypeRules": {
|
|
"package": "Use for bundled products such as flight+hotel packages or hotel+transfer packages. Include included components and do not mix directly with standalone room-only rates.",
|
|
"standalone": "Use for individual bookings such as hotel-only rates, flights, golf tee times, nightlife tables, yacht charters, and excursions.",
|
|
"calculated": "Use for automation-derived itinerary and budget totals built from current package or standalone components."
|
|
},
|
|
"outputSchema": {
|
|
"optionPrices": [
|
|
{
|
|
"seedKey": "stable app option key when available",
|
|
"price": "numeric price only, or null when unavailable",
|
|
"displayLabel": "human-readable price label",
|
|
"category": "hotel | flight | golf | nightlife | excursion | itinerary | budget",
|
|
"source": "travel site or vendor",
|
|
"sourceUrl": "exact result or source URL",
|
|
"bookingType": "package | standalone | calculated",
|
|
"priceBasis": "perTraveler | perNight | perDay | perPerson | perGroup | totalPackage | perRound | perTable",
|
|
"unitPrice": "original unit price when source quotes per night or per day",
|
|
"tripTotalPrice": "calculated full-stay/check-in-to-check-out price when source quotes per night or per day",
|
|
"includedComponents": ["flight", "hotel", "transfer", "golf", "nightlife", "excursion"],
|
|
"excludedComponents": ["components that must be budgeted separately"],
|
|
"origin": "airport code for flight/package quotes when applicable",
|
|
"destination": "airport or destination code when applicable",
|
|
"availability": "available | unavailable | sold-out | login-required | request-quote",
|
|
"features": ["structured decision features"],
|
|
"amenities": ["hotel or venue amenities"],
|
|
"inclusions": ["included items"],
|
|
"limitations": ["tradeoffs, caveats, restrictions"],
|
|
"decisionNote": "short decision note"
|
|
}
|
|
],
|
|
"derivedItineraries": [
|
|
{
|
|
"seedKey": "itinerary-budget | itinerary-balanced | itinerary-splurge | itinerary-concierge or new stable key",
|
|
"tier": "Budget | Balanced | Splurge | Concierge",
|
|
"perPerson": "numeric calculated per-person total",
|
|
"groupTotal": "numeric calculated group total when group size is known",
|
|
"groupSize": "8 | 10 | 12 or selected party size",
|
|
"components": ["component price keys used"],
|
|
"assumptions": ["calculation assumptions"],
|
|
"summary": "short recommendation summary"
|
|
}
|
|
],
|
|
"budgetScenarios": [
|
|
{
|
|
"id": "stable scenario id",
|
|
"tier": "Budget | Balanced | Splurge",
|
|
"groupSize": "numeric group size",
|
|
"perPerson": "numeric calculated per-person total",
|
|
"groupTotal": "numeric calculated group total",
|
|
"summary": "short scenario summary",
|
|
"notes": ["component breakdown and assumptions"]
|
|
}
|
|
]
|
|
},
|
|
"notes": [
|
|
"Use seed-data.js as the current baseline for names, links, and budget assumptions.",
|
|
"Check hotels, flights, golf, nightlife, and excursions on every run before updating itinerary or budget recommendations.",
|
|
"For flights, search both airline direct-booking pages and travel aggregators such as Google Flights, KAYAK, Expedia, and similar public flight search tools when available.",
|
|
"Differentiate bundled package prices from standalone booking prices using bookingType and priceBasis on every price point.",
|
|
"For package quotes, list the included and excluded components so budgets do not double-count flights, hotels, transfers, or resort credits.",
|
|
"For standalone quotes, list the exact unit being priced: per night, per traveler, per person, per group, per round, or per table.",
|
|
"For per-night or per-day hotel/activity rates, calculate the total for the expected check-in/check-out dates and preserve the unit rate in unitPrice or displayLabel.",
|
|
"Itinerary and budget options are calculated outputs. Recompute them from the freshest current package and standalone component prices instead of treating seed-data.js totals as current.",
|
|
"Write a human-readable report to price-watch/latest-report.md on every run.",
|
|
"Append one machine-readable summary line per run to price-watch/history.jsonl, including per-option price points, derivedItineraries, and budgetScenarios keyed by stable option ids or seed keys.",
|
|
"Capture structured option details when available: current price, availability, source, sourceUrl, highlights, features, amenities, inclusions, limitations, and a short decision note.",
|
|
"If a source is gated behind login or membership, note that clearly in both outputs."
|
|
]
|
|
}
|