{
  "$schema": "https://schema.org/Dataset",
  "name": "TravelBudget — source lineage",
  "description": "Named sources and provenance grade behind every cost component, per city.",
  "version": "2026.1",
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "baselineReviewed": "2026-Q3",
  "freshness": "Exchange rates updated daily. Local cost baselines reviewed quarterly.",
  "disclosure": "Transport and activity figures come from operators' published tariffs. Accommodation and food are sampled from named public marketplaces and price indexes. Miscellaneous spend is model-derived. Currency conversion uses daily ECB reference rates.",
  "fx": {
    "base": "USD",
    "asOf": "2026-08-21",
    "fetchedAt": "2026-08-21T15:41:16.647Z",
    "source": "European Central Bank reference rates via frankfurter.dev",
    "feed": "https://travelbudget.co/data/fx.json"
  },
  "grades": [
    {
      "grade": "published",
      "label": "Published tariff",
      "meaning": "Read from the operator's own fare or admission page. If the operator changes the price, this line is wrong until our next review — tell us and we fix it."
    },
    {
      "grade": "sampled",
      "label": "Sampled listings",
      "meaning": "Summarised from listing and menu prices visible on the named public marketplaces during the review window. Reproducible: run the same query for the same dates and you should land inside our range."
    },
    {
      "grade": "derived",
      "label": "Model-derived",
      "meaning": "Computed by the TravelBudget model from the city cost baseline rather than read off a single source. Documented on /about and reproducible from the published formula."
    }
  ],
  "registry": [
    {
      "id": "booking",
      "name": "Booking.com",
      "url": "https://www.booking.com",
      "kind": "marketplace",
      "cadence": "Quarterly sampling window",
      "role": "Hotel and guesthouse nightly rates by tier and neighbourhood"
    },
    {
      "id": "google-hotels",
      "name": "Google Hotels",
      "url": "https://www.google.com/travel/hotels",
      "kind": "marketplace",
      "cadence": "Quarterly sampling window",
      "role": "Cross-check on hotel median rates and seasonal spread"
    },
    {
      "id": "hostelworld",
      "name": "Hostelworld",
      "url": "https://www.hostelworld.com",
      "kind": "marketplace",
      "cadence": "Quarterly sampling window",
      "role": "Dorm and private-room floor for the budget tier"
    },
    {
      "id": "airbnb",
      "name": "Airbnb",
      "url": "https://www.airbnb.com",
      "kind": "marketplace",
      "cadence": "Quarterly sampling window",
      "role": "Short-let rates for stays of a week or longer"
    },
    {
      "id": "numbeo",
      "name": "Numbeo cost-of-living indexes",
      "url": "https://www.numbeo.com/cost-of-living/",
      "kind": "index",
      "cadence": "Continuously crowd-updated; reviewed quarterly",
      "role": "Restaurant, grocery-basket and local-transport price levels per city"
    },
    {
      "id": "oecd-ppp",
      "name": "OECD purchasing power parities",
      "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm",
      "kind": "official",
      "cadence": "Annual",
      "role": "Sanity check that city price levels line up with national price levels"
    },
    {
      "id": "unwto",
      "name": "UN Tourism (UNWTO) arrivals data",
      "url": "https://www.unwto.org/tourism-statistics",
      "kind": "official",
      "cadence": "Annual/quarterly releases",
      "role": "Seasonality shape — which months are low, shoulder and peak"
    },
    {
      "id": "ecb",
      "name": "ECB reference rates via Frankfurter",
      "url": "https://frankfurter.dev",
      "kind": "fx",
      "cadence": "Every business day",
      "role": "USD conversion for all local-currency figures"
    }
  ],
  "cities": [
    {
      "slug": "amman",
      "name": "Amman",
      "url": "https://travelbudget.co/city/amman#sources",
      "samplingAreas": [
        "Downtown",
        "Jabal Amman",
        "Abdali"
      ],
      "transitOperator": {
        "name": "Greater Amman Municipality bus network (Amman Bus)",
        "url": "https://ammanbus.jo"
      },
      "namedAttractions": [
        "Amman Citadel",
        "Roman Theatre",
        "Jordan Museum"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Amman sampled by tier across Downtown, Jabal Amman, Abdali, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Amman on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Amman, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Amman entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Greater Amman Municipality bus network (Amman Bus)",
              "url": "https://ammanbus.jo"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Greater Amman Municipality bus network (Amman Bus), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Amman Citadel"
            },
            {
              "name": "Roman Theatre"
            },
            {
              "name": "Jordan Museum"
            }
          ],
          "frame": "Posted admission for Amman Citadel, Roman Theatre, Jordan Museum and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "amsterdam",
      "name": "Amsterdam",
      "url": "https://travelbudget.co/city/amsterdam#sources",
      "samplingAreas": [
        "Centrum",
        "De Pijp",
        "Oud-West"
      ],
      "transitOperator": {
        "name": "GVB Amsterdam",
        "url": "https://www.gvb.nl"
      },
      "namedAttractions": [
        "Rijksmuseum",
        "Van Gogh Museum",
        "Anne Frank House"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Amsterdam sampled by tier across Centrum, De Pijp, Oud-West, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Amsterdam on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Amsterdam, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Amsterdam entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "GVB Amsterdam",
              "url": "https://www.gvb.nl"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by GVB Amsterdam, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Rijksmuseum"
            },
            {
              "name": "Van Gogh Museum"
            },
            {
              "name": "Anne Frank House"
            }
          ],
          "frame": "Posted admission for Rijksmuseum, Van Gogh Museum, Anne Frank House and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "athens",
      "name": "Athens",
      "url": "https://travelbudget.co/city/athens#sources",
      "samplingAreas": [
        "Plaka",
        "Koukaki",
        "Monastiraki"
      ],
      "transitOperator": {
        "name": "OASA / Athens Urban Transport",
        "url": "https://www.oasa.gr"
      },
      "namedAttractions": [
        "Acropolis & Parthenon",
        "Acropolis Museum",
        "National Archaeological Museum"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Athens sampled by tier across Plaka, Koukaki, Monastiraki, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Athens on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Athens, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Athens entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "OASA / Athens Urban Transport",
              "url": "https://www.oasa.gr"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by OASA / Athens Urban Transport, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Acropolis & Parthenon"
            },
            {
              "name": "Acropolis Museum"
            },
            {
              "name": "National Archaeological Museum"
            }
          ],
          "frame": "Posted admission for Acropolis & Parthenon, Acropolis Museum, National Archaeological Museum and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "auckland",
      "name": "Auckland",
      "url": "https://travelbudget.co/city/auckland#sources",
      "samplingAreas": [
        "CBD",
        "Ponsonby",
        "Parnell"
      ],
      "transitOperator": {
        "name": "Auckland Transport (AT HOP)",
        "url": "https://at.govt.nz"
      },
      "namedAttractions": [
        "Sky Tower",
        "Auckland War Memorial Museum",
        "Waiheke Island ferry"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Auckland sampled by tier across CBD, Ponsonby, Parnell, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Auckland on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Auckland, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Auckland entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Auckland Transport (AT HOP)",
              "url": "https://at.govt.nz"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Auckland Transport (AT HOP), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Sky Tower"
            },
            {
              "name": "Auckland War Memorial Museum"
            },
            {
              "name": "Waiheke Island ferry"
            }
          ],
          "frame": "Posted admission for Sky Tower, Auckland War Memorial Museum, Waiheke Island ferry and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "bali",
      "name": "Bali",
      "url": "https://travelbudget.co/city/bali#sources",
      "samplingAreas": [
        "Canggu",
        "Ubud",
        "Seminyak"
      ],
      "transitOperator": {
        "name": "Trans Metro Dewata / scooter rental market"
      },
      "namedAttractions": [
        "Uluwatu Temple",
        "Tirta Empul",
        "Tegallalang rice terraces"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Bali sampled by tier across Canggu, Ubud, Seminyak, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Bali on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Bali, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Bali entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Trans Metro Dewata / scooter rental market"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Trans Metro Dewata / scooter rental market, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Uluwatu Temple"
            },
            {
              "name": "Tirta Empul"
            },
            {
              "name": "Tegallalang rice terraces"
            }
          ],
          "frame": "Posted admission for Uluwatu Temple, Tirta Empul, Tegallalang rice terraces and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "bangkok",
      "name": "Bangkok",
      "url": "https://travelbudget.co/city/bangkok#sources",
      "samplingAreas": [
        "Sukhumvit",
        "Silom",
        "Old City"
      ],
      "transitOperator": {
        "name": "BTS Skytrain & MRT Bangkok",
        "url": "https://www.bts.co.th"
      },
      "namedAttractions": [
        "Grand Palace & Wat Phra Kaew",
        "Wat Arun",
        "Jim Thompson House"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Bangkok sampled by tier across Sukhumvit, Silom, Old City, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Bangkok on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Bangkok, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Bangkok entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "BTS Skytrain & MRT Bangkok",
              "url": "https://www.bts.co.th"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by BTS Skytrain & MRT Bangkok, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Grand Palace & Wat Phra Kaew"
            },
            {
              "name": "Wat Arun"
            },
            {
              "name": "Jim Thompson House"
            }
          ],
          "frame": "Posted admission for Grand Palace & Wat Phra Kaew, Wat Arun, Jim Thompson House and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "barcelona",
      "name": "Barcelona",
      "url": "https://travelbudget.co/city/barcelona#sources",
      "samplingAreas": [
        "Eixample",
        "Gràcia",
        "El Born"
      ],
      "transitOperator": {
        "name": "TMB Barcelona",
        "url": "https://www.tmb.cat"
      },
      "namedAttractions": [
        "Sagrada Família",
        "Park Güell",
        "Casa Batlló"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Barcelona sampled by tier across Eixample, Gràcia, El Born, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Barcelona on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Barcelona, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Barcelona entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "TMB Barcelona",
              "url": "https://www.tmb.cat"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by TMB Barcelona, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Sagrada Família"
            },
            {
              "name": "Park Güell"
            },
            {
              "name": "Casa Batlló"
            }
          ],
          "frame": "Posted admission for Sagrada Família, Park Güell, Casa Batlló and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "berlin",
      "name": "Berlin",
      "url": "https://travelbudget.co/city/berlin#sources",
      "samplingAreas": [
        "Mitte",
        "Kreuzberg",
        "Prenzlauer Berg"
      ],
      "transitOperator": {
        "name": "BVG Berlin",
        "url": "https://www.bvg.de"
      },
      "namedAttractions": [
        "Pergamon / Museum Island",
        "Reichstag dome",
        "Berlinische Galerie"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Berlin sampled by tier across Mitte, Kreuzberg, Prenzlauer Berg, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Berlin on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Berlin, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Berlin entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "BVG Berlin",
              "url": "https://www.bvg.de"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by BVG Berlin, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Pergamon / Museum Island"
            },
            {
              "name": "Reichstag dome"
            },
            {
              "name": "Berlinische Galerie"
            }
          ],
          "frame": "Posted admission for Pergamon / Museum Island, Reichstag dome, Berlinische Galerie and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "bogota",
      "name": "Bogotá",
      "url": "https://travelbudget.co/city/bogota#sources",
      "samplingAreas": [
        "La Candelaria",
        "Chapinero",
        "Usaquén"
      ],
      "transitOperator": {
        "name": "TransMilenio",
        "url": "https://www.transmilenio.gov.co"
      },
      "namedAttractions": [
        "Museo del Oro",
        "Monserrate funicular",
        "Museo Botero"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Bogotá sampled by tier across La Candelaria, Chapinero, Usaquén, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Bogotá on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Bogotá, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Bogotá entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "TransMilenio",
              "url": "https://www.transmilenio.gov.co"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by TransMilenio, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Museo del Oro"
            },
            {
              "name": "Monserrate funicular"
            },
            {
              "name": "Museo Botero"
            }
          ],
          "frame": "Posted admission for Museo del Oro, Monserrate funicular, Museo Botero and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "brussels",
      "name": "Brussels",
      "url": "https://travelbudget.co/city/brussels#sources",
      "samplingAreas": [
        "Centre",
        "Ixelles",
        "Saint-Gilles"
      ],
      "transitOperator": {
        "name": "STIB-MIVB",
        "url": "https://www.stib-mivb.be"
      },
      "namedAttractions": [
        "Atomium",
        "Magritte Museum",
        "Grand-Place walking circuit"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Brussels sampled by tier across Centre, Ixelles, Saint-Gilles, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Brussels on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Brussels, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Brussels entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "STIB-MIVB",
              "url": "https://www.stib-mivb.be"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by STIB-MIVB, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Atomium"
            },
            {
              "name": "Magritte Museum"
            },
            {
              "name": "Grand-Place walking circuit"
            }
          ],
          "frame": "Posted admission for Atomium, Magritte Museum, Grand-Place walking circuit and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "bucharest",
      "name": "Bucharest",
      "url": "https://travelbudget.co/city/bucharest#sources",
      "samplingAreas": [
        "Old Town",
        "Universitate",
        "Dorobanți"
      ],
      "transitOperator": {
        "name": "STB Bucharest",
        "url": "https://www.stbsa.ro"
      },
      "namedAttractions": [
        "Palace of the Parliament",
        "National Museum of Art",
        "Village Museum"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Bucharest sampled by tier across Old Town, Universitate, Dorobanți, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Bucharest on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Bucharest, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Bucharest entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "STB Bucharest",
              "url": "https://www.stbsa.ro"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by STB Bucharest, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Palace of the Parliament"
            },
            {
              "name": "National Museum of Art"
            },
            {
              "name": "Village Museum"
            }
          ],
          "frame": "Posted admission for Palace of the Parliament, National Museum of Art, Village Museum and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "budapest",
      "name": "Budapest",
      "url": "https://travelbudget.co/city/budapest#sources",
      "samplingAreas": [
        "District V",
        "District VII",
        "Buda Castle"
      ],
      "transitOperator": {
        "name": "BKK Budapest",
        "url": "https://bkk.hu"
      },
      "namedAttractions": [
        "Széchenyi Thermal Bath",
        "Hungarian Parliament tour",
        "Hungarian National Gallery"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Budapest sampled by tier across District V, District VII, Buda Castle, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Budapest on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Budapest, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Budapest entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "BKK Budapest",
              "url": "https://bkk.hu"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by BKK Budapest, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Széchenyi Thermal Bath"
            },
            {
              "name": "Hungarian Parliament tour"
            },
            {
              "name": "Hungarian National Gallery"
            }
          ],
          "frame": "Posted admission for Széchenyi Thermal Bath, Hungarian Parliament tour, Hungarian National Gallery and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "buenos-aires",
      "name": "Buenos Aires",
      "url": "https://travelbudget.co/city/buenos-aires#sources",
      "samplingAreas": [
        "Palermo",
        "Recoleta",
        "San Telmo"
      ],
      "transitOperator": {
        "name": "Subte / SUBE network",
        "url": "https://buenosaires.gob.ar/subte"
      },
      "namedAttractions": [
        "Teatro Colón tour",
        "MALBA",
        "Recoleta Cemetery"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Buenos Aires sampled by tier across Palermo, Recoleta, San Telmo, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Buenos Aires on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Buenos Aires, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Buenos Aires entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Subte / SUBE network",
              "url": "https://buenosaires.gob.ar/subte"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Subte / SUBE network, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Teatro Colón tour"
            },
            {
              "name": "MALBA"
            },
            {
              "name": "Recoleta Cemetery"
            }
          ],
          "frame": "Posted admission for Teatro Colón tour, MALBA, Recoleta Cemetery and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "cairo",
      "name": "Cairo",
      "url": "https://travelbudget.co/city/cairo#sources",
      "samplingAreas": [
        "Downtown",
        "Zamalek",
        "Giza"
      ],
      "transitOperator": {
        "name": "Cairo Metro (NAT)",
        "url": "https://cairometro.gov.eg"
      },
      "namedAttractions": [
        "Giza pyramids complex",
        "Grand Egyptian Museum",
        "Khan el-Khalili circuit"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Cairo sampled by tier across Downtown, Zamalek, Giza, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Cairo on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Cairo, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Cairo entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Cairo Metro (NAT)",
              "url": "https://cairometro.gov.eg"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Cairo Metro (NAT), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Giza pyramids complex"
            },
            {
              "name": "Grand Egyptian Museum"
            },
            {
              "name": "Khan el-Khalili circuit"
            }
          ],
          "frame": "Posted admission for Giza pyramids complex, Grand Egyptian Museum, Khan el-Khalili circuit and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "cancun",
      "name": "Cancún",
      "url": "https://travelbudget.co/city/cancun#sources",
      "samplingAreas": [
        "Hotel Zone",
        "Centro",
        "Puerto Juárez"
      ],
      "transitOperator": {
        "name": "ADO buses & R-1/R-2 city routes",
        "url": "https://www.ado.com.mx"
      },
      "namedAttractions": [
        "Chichén Itzá day trip",
        "Museo Maya de Cancún",
        "Isla Mujeres ferry"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Cancún sampled by tier across Hotel Zone, Centro, Puerto Juárez, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Cancún on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Cancún, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Cancún entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "ADO buses & R-1/R-2 city routes",
              "url": "https://www.ado.com.mx"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by ADO buses & R-1/R-2 city routes, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Chichén Itzá day trip"
            },
            {
              "name": "Museo Maya de Cancún"
            },
            {
              "name": "Isla Mujeres ferry"
            }
          ],
          "frame": "Posted admission for Chichén Itzá day trip, Museo Maya de Cancún, Isla Mujeres ferry and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "cape-town",
      "name": "Cape Town",
      "url": "https://travelbudget.co/city/cape-town#sources",
      "samplingAreas": [
        "City Bowl",
        "Sea Point",
        "Woodstock"
      ],
      "transitOperator": {
        "name": "MyCiTi Cape Town",
        "url": "https://www.myciti.org.za"
      },
      "namedAttractions": [
        "Table Mountain cableway",
        "Robben Island ferry",
        "Kirstenbosch Garden"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Cape Town sampled by tier across City Bowl, Sea Point, Woodstock, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Cape Town on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Cape Town, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Cape Town entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "MyCiTi Cape Town",
              "url": "https://www.myciti.org.za"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by MyCiTi Cape Town, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Table Mountain cableway"
            },
            {
              "name": "Robben Island ferry"
            },
            {
              "name": "Kirstenbosch Garden"
            }
          ],
          "frame": "Posted admission for Table Mountain cableway, Robben Island ferry, Kirstenbosch Garden and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "chiang-mai",
      "name": "Chiang Mai",
      "url": "https://travelbudget.co/city/chiang-mai#sources",
      "samplingAreas": [
        "Old City",
        "Nimman",
        "Riverside"
      ],
      "transitOperator": {
        "name": "RTC City Bus & songthaew fares"
      },
      "namedAttractions": [
        "Wat Phra That Doi Suthep",
        "Wat Chedi Luang",
        "Elephant Nature Park"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Chiang Mai sampled by tier across Old City, Nimman, Riverside, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Chiang Mai on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Chiang Mai, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Chiang Mai entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "RTC City Bus & songthaew fares"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by RTC City Bus & songthaew fares, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Wat Phra That Doi Suthep"
            },
            {
              "name": "Wat Chedi Luang"
            },
            {
              "name": "Elephant Nature Park"
            }
          ],
          "frame": "Posted admission for Wat Phra That Doi Suthep, Wat Chedi Luang, Elephant Nature Park and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "colombo",
      "name": "Colombo",
      "url": "https://travelbudget.co/city/colombo#sources",
      "samplingAreas": [
        "Fort",
        "Cinnamon Gardens",
        "Mount Lavinia"
      ],
      "transitOperator": {
        "name": "Sri Lanka Transport Board",
        "url": "https://www.sltb.lk"
      },
      "namedAttractions": [
        "National Museum of Colombo",
        "Gangaramaya Temple",
        "Galle Face promenade"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Colombo sampled by tier across Fort, Cinnamon Gardens, Mount Lavinia, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Colombo on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Colombo, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Colombo entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Sri Lanka Transport Board",
              "url": "https://www.sltb.lk"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Sri Lanka Transport Board, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "National Museum of Colombo"
            },
            {
              "name": "Gangaramaya Temple"
            },
            {
              "name": "Galle Face promenade"
            }
          ],
          "frame": "Posted admission for National Museum of Colombo, Gangaramaya Temple, Galle Face promenade and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "copenhagen",
      "name": "Copenhagen",
      "url": "https://travelbudget.co/city/copenhagen#sources",
      "samplingAreas": [
        "Indre By",
        "Vesterbro",
        "Nørrebro"
      ],
      "transitOperator": {
        "name": "DOT / Movia Copenhagen",
        "url": "https://dinoffentligetransport.dk"
      },
      "namedAttractions": [
        "Tivoli Gardens",
        "Ny Carlsberg Glyptotek",
        "Designmuseum Danmark"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Copenhagen sampled by tier across Indre By, Vesterbro, Nørrebro, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Copenhagen on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Copenhagen, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Copenhagen entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "DOT / Movia Copenhagen",
              "url": "https://dinoffentligetransport.dk"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by DOT / Movia Copenhagen, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Tivoli Gardens"
            },
            {
              "name": "Ny Carlsberg Glyptotek"
            },
            {
              "name": "Designmuseum Danmark"
            }
          ],
          "frame": "Posted admission for Tivoli Gardens, Ny Carlsberg Glyptotek, Designmuseum Danmark and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "delhi",
      "name": "Delhi",
      "url": "https://travelbudget.co/city/delhi#sources",
      "samplingAreas": [
        "Connaught Place",
        "Paharganj",
        "Hauz Khas"
      ],
      "transitOperator": {
        "name": "Delhi Metro (DMRC)",
        "url": "https://www.delhimetrorail.com"
      },
      "namedAttractions": [
        "Red Fort",
        "Humayun's Tomb",
        "Qutub Minar"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Delhi sampled by tier across Connaught Place, Paharganj, Hauz Khas, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Delhi on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Delhi, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Delhi entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Delhi Metro (DMRC)",
              "url": "https://www.delhimetrorail.com"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Delhi Metro (DMRC), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Red Fort"
            },
            {
              "name": "Humayun's Tomb"
            },
            {
              "name": "Qutub Minar"
            }
          ],
          "frame": "Posted admission for Red Fort, Humayun's Tomb, Qutub Minar and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "dubai",
      "name": "Dubai",
      "url": "https://travelbudget.co/city/dubai#sources",
      "samplingAreas": [
        "Downtown",
        "Marina",
        "Deira"
      ],
      "transitOperator": {
        "name": "Dubai RTA (nol)",
        "url": "https://www.rta.ae"
      },
      "namedAttractions": [
        "Burj Khalifa At the Top",
        "Dubai Frame",
        "Museum of the Future"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Dubai sampled by tier across Downtown, Marina, Deira, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Dubai on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Dubai, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Dubai entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Dubai RTA (nol)",
              "url": "https://www.rta.ae"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Dubai RTA (nol), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Burj Khalifa At the Top"
            },
            {
              "name": "Dubai Frame"
            },
            {
              "name": "Museum of the Future"
            }
          ],
          "frame": "Posted admission for Burj Khalifa At the Top, Dubai Frame, Museum of the Future and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "dublin",
      "name": "Dublin",
      "url": "https://travelbudget.co/city/dublin#sources",
      "samplingAreas": [
        "City Centre",
        "Temple Bar",
        "Rathmines"
      ],
      "transitOperator": {
        "name": "Transport for Ireland (Leap)",
        "url": "https://www.transportforireland.ie"
      },
      "namedAttractions": [
        "Guinness Storehouse",
        "Trinity College Book of Kells",
        "Kilmainham Gaol"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Dublin sampled by tier across City Centre, Temple Bar, Rathmines, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Dublin on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Dublin, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Dublin entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Transport for Ireland (Leap)",
              "url": "https://www.transportforireland.ie"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Transport for Ireland (Leap), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Guinness Storehouse"
            },
            {
              "name": "Trinity College Book of Kells"
            },
            {
              "name": "Kilmainham Gaol"
            }
          ],
          "frame": "Posted admission for Guinness Storehouse, Trinity College Book of Kells, Kilmainham Gaol and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "dubrovnik",
      "name": "Dubrovnik",
      "url": "https://travelbudget.co/city/dubrovnik#sources",
      "samplingAreas": [
        "Old Town",
        "Lapad",
        "Ploče"
      ],
      "transitOperator": {
        "name": "Libertas Dubrovnik",
        "url": "https://www.libertasdubrovnik.hr"
      },
      "namedAttractions": [
        "City Walls",
        "Srđ cable car",
        "Rector's Palace"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Dubrovnik sampled by tier across Old Town, Lapad, Ploče, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Dubrovnik on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Dubrovnik, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Dubrovnik entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Libertas Dubrovnik",
              "url": "https://www.libertasdubrovnik.hr"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Libertas Dubrovnik, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "City Walls"
            },
            {
              "name": "Srđ cable car"
            },
            {
              "name": "Rector's Palace"
            }
          ],
          "frame": "Posted admission for City Walls, Srđ cable car, Rector's Palace and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "florence",
      "name": "Florence",
      "url": "https://travelbudget.co/city/florence#sources",
      "samplingAreas": [
        "Centro Storico",
        "Oltrarno",
        "San Marco"
      ],
      "transitOperator": {
        "name": "Autolinee Toscane",
        "url": "https://www.at-bus.it"
      },
      "namedAttractions": [
        "Uffizi Gallery",
        "Galleria dell'Accademia",
        "Duomo complex"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Florence sampled by tier across Centro Storico, Oltrarno, San Marco, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Florence on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Florence, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Florence entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Autolinee Toscane",
              "url": "https://www.at-bus.it"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Autolinee Toscane, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Uffizi Gallery"
            },
            {
              "name": "Galleria dell'Accademia"
            },
            {
              "name": "Duomo complex"
            }
          ],
          "frame": "Posted admission for Uffizi Gallery, Galleria dell'Accademia, Duomo complex and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "hanoi",
      "name": "Hanoi",
      "url": "https://travelbudget.co/city/hanoi#sources",
      "samplingAreas": [
        "Old Quarter",
        "Ba Dinh",
        "Tay Ho"
      ],
      "transitOperator": {
        "name": "Hanoi Metro & Transerco buses",
        "url": "https://hanoimetro.net.vn"
      },
      "namedAttractions": [
        "Temple of Literature",
        "Vietnam Museum of Ethnology",
        "Hoa Lo Prison"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Hanoi sampled by tier across Old Quarter, Ba Dinh, Tay Ho, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Hanoi on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Hanoi, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Hanoi entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Hanoi Metro & Transerco buses",
              "url": "https://hanoimetro.net.vn"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Hanoi Metro & Transerco buses, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Temple of Literature"
            },
            {
              "name": "Vietnam Museum of Ethnology"
            },
            {
              "name": "Hoa Lo Prison"
            }
          ],
          "frame": "Posted admission for Temple of Literature, Vietnam Museum of Ethnology, Hoa Lo Prison and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "havana",
      "name": "Havana",
      "url": "https://travelbudget.co/city/havana#sources",
      "samplingAreas": [
        "Habana Vieja",
        "Vedado",
        "Centro Habana"
      ],
      "transitOperator": {
        "name": "Ómnibus Metropolitanos fares"
      },
      "namedAttractions": [
        "Museo de la Revolución",
        "Museo Nacional de Bellas Artes",
        "Malecón walking circuit"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Havana sampled by tier across Habana Vieja, Vedado, Centro Habana, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Havana on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Havana, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Havana entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Ómnibus Metropolitanos fares"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Ómnibus Metropolitanos fares, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Museo de la Revolución"
            },
            {
              "name": "Museo Nacional de Bellas Artes"
            },
            {
              "name": "Malecón walking circuit"
            }
          ],
          "frame": "Posted admission for Museo de la Revolución, Museo Nacional de Bellas Artes, Malecón walking circuit and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "helsinki",
      "name": "Helsinki",
      "url": "https://travelbudget.co/city/helsinki#sources",
      "samplingAreas": [
        "Kamppi",
        "Kallio",
        "Punavuori"
      ],
      "transitOperator": {
        "name": "HSL Helsinki",
        "url": "https://www.hsl.fi"
      },
      "namedAttractions": [
        "Suomenlinna ferry",
        "Ateneum",
        "Löyly sauna"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Helsinki sampled by tier across Kamppi, Kallio, Punavuori, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Helsinki on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Helsinki, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Helsinki entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "HSL Helsinki",
              "url": "https://www.hsl.fi"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by HSL Helsinki, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Suomenlinna ferry"
            },
            {
              "name": "Ateneum"
            },
            {
              "name": "Löyly sauna"
            }
          ],
          "frame": "Posted admission for Suomenlinna ferry, Ateneum, Löyly sauna and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "ho-chi-minh-city",
      "name": "Ho Chi Minh City",
      "url": "https://travelbudget.co/city/ho-chi-minh-city#sources",
      "samplingAreas": [
        "District 1",
        "District 3",
        "Binh Thanh"
      ],
      "transitOperator": {
        "name": "HCMC bus network & Metro Line 1",
        "url": "https://buyttphcm.com.vn"
      },
      "namedAttractions": [
        "War Remnants Museum",
        "Reunification Palace",
        "Cu Chi tunnels"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Ho Chi Minh City sampled by tier across District 1, District 3, Binh Thanh, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Ho Chi Minh City on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Ho Chi Minh City, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Ho Chi Minh City entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "HCMC bus network & Metro Line 1",
              "url": "https://buyttphcm.com.vn"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by HCMC bus network & Metro Line 1, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "War Remnants Museum"
            },
            {
              "name": "Reunification Palace"
            },
            {
              "name": "Cu Chi tunnels"
            }
          ],
          "frame": "Posted admission for War Remnants Museum, Reunification Palace, Cu Chi tunnels and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "hong-kong",
      "name": "Hong Kong",
      "url": "https://travelbudget.co/city/hong-kong#sources",
      "samplingAreas": [
        "Central",
        "Kowloon",
        "Wan Chai"
      ],
      "transitOperator": {
        "name": "MTR Hong Kong (Octopus)",
        "url": "https://www.mtr.com.hk"
      },
      "namedAttractions": [
        "Victoria Peak Tram",
        "M+ museum",
        "Big Buddha cable car"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Hong Kong sampled by tier across Central, Kowloon, Wan Chai, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Hong Kong on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Hong Kong, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Hong Kong entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "MTR Hong Kong (Octopus)",
              "url": "https://www.mtr.com.hk"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by MTR Hong Kong (Octopus), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Victoria Peak Tram"
            },
            {
              "name": "M+ museum"
            },
            {
              "name": "Big Buddha cable car"
            }
          ],
          "frame": "Posted admission for Victoria Peak Tram, M+ museum, Big Buddha cable car and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "istanbul",
      "name": "Istanbul",
      "url": "https://travelbudget.co/city/istanbul#sources",
      "samplingAreas": [
        "Fatih",
        "Beyoğlu",
        "Kadıköy"
      ],
      "transitOperator": {
        "name": "İETT / İstanbulkart",
        "url": "https://www.iett.istanbul"
      },
      "namedAttractions": [
        "Hagia Sophia",
        "Topkapı Palace",
        "Basilica Cistern"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Istanbul sampled by tier across Fatih, Beyoğlu, Kadıköy, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Istanbul on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Istanbul, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Istanbul entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "İETT / İstanbulkart",
              "url": "https://www.iett.istanbul"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by İETT / İstanbulkart, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Hagia Sophia"
            },
            {
              "name": "Topkapı Palace"
            },
            {
              "name": "Basilica Cistern"
            }
          ],
          "frame": "Posted admission for Hagia Sophia, Topkapı Palace, Basilica Cistern and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "kathmandu",
      "name": "Kathmandu",
      "url": "https://travelbudget.co/city/kathmandu#sources",
      "samplingAreas": [
        "Thamel",
        "Patan",
        "Boudha"
      ],
      "transitOperator": {
        "name": "Sajha Yatayat",
        "url": "https://sajhayatayat.com.np"
      },
      "namedAttractions": [
        "Boudhanath Stupa",
        "Pashupatinath",
        "Patan Durbar Square"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Kathmandu sampled by tier across Thamel, Patan, Boudha, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Kathmandu on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Kathmandu, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Kathmandu entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Sajha Yatayat",
              "url": "https://sajhayatayat.com.np"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Sajha Yatayat, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Boudhanath Stupa"
            },
            {
              "name": "Pashupatinath"
            },
            {
              "name": "Patan Durbar Square"
            }
          ],
          "frame": "Posted admission for Boudhanath Stupa, Pashupatinath, Patan Durbar Square and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "krakow",
      "name": "Krakow",
      "url": "https://travelbudget.co/city/krakow#sources",
      "samplingAreas": [
        "Old Town",
        "Kazimierz",
        "Podgórze"
      ],
      "transitOperator": {
        "name": "MPK Kraków",
        "url": "https://www.mpk.krakow.pl"
      },
      "namedAttractions": [
        "Wawel Castle",
        "Auschwitz-Birkenau memorial",
        "Wieliczka Salt Mine"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Krakow sampled by tier across Old Town, Kazimierz, Podgórze, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Krakow on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Krakow, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Krakow entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "MPK Kraków",
              "url": "https://www.mpk.krakow.pl"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by MPK Kraków, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Wawel Castle"
            },
            {
              "name": "Auschwitz-Birkenau memorial"
            },
            {
              "name": "Wieliczka Salt Mine"
            }
          ],
          "frame": "Posted admission for Wawel Castle, Auschwitz-Birkenau memorial, Wieliczka Salt Mine and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "kuala-lumpur",
      "name": "Kuala Lumpur",
      "url": "https://travelbudget.co/city/kuala-lumpur#sources",
      "samplingAreas": [
        "KLCC",
        "Bukit Bintang",
        "Chinatown"
      ],
      "transitOperator": {
        "name": "Rapid KL",
        "url": "https://myrapid.com.my"
      },
      "namedAttractions": [
        "Petronas Towers skybridge",
        "Batu Caves",
        "Islamic Arts Museum"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Kuala Lumpur sampled by tier across KLCC, Bukit Bintang, Chinatown, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Kuala Lumpur on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Kuala Lumpur, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Kuala Lumpur entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Rapid KL",
              "url": "https://myrapid.com.my"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Rapid KL, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Petronas Towers skybridge"
            },
            {
              "name": "Batu Caves"
            },
            {
              "name": "Islamic Arts Museum"
            }
          ],
          "frame": "Posted admission for Petronas Towers skybridge, Batu Caves, Islamic Arts Museum and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "kyoto",
      "name": "Kyoto",
      "url": "https://travelbudget.co/city/kyoto#sources",
      "samplingAreas": [
        "Gion",
        "Downtown Kyoto",
        "Arashiyama"
      ],
      "transitOperator": {
        "name": "Kyoto City Bus & Subway",
        "url": "https://www.city.kyoto.lg.jp/kotsu/"
      },
      "namedAttractions": [
        "Kinkaku-ji",
        "Fushimi Inari",
        "Nijō Castle"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Kyoto sampled by tier across Gion, Downtown Kyoto, Arashiyama, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Kyoto on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Kyoto, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Kyoto entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Kyoto City Bus & Subway",
              "url": "https://www.city.kyoto.lg.jp/kotsu/"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Kyoto City Bus & Subway, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Kinkaku-ji"
            },
            {
              "name": "Fushimi Inari"
            },
            {
              "name": "Nijō Castle"
            }
          ],
          "frame": "Posted admission for Kinkaku-ji, Fushimi Inari, Nijō Castle and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "lima",
      "name": "Lima",
      "url": "https://travelbudget.co/city/lima#sources",
      "samplingAreas": [
        "Miraflores",
        "Barranco",
        "Centro"
      ],
      "transitOperator": {
        "name": "ATU / Metropolitano",
        "url": "https://www.atu.gob.pe"
      },
      "namedAttractions": [
        "Museo Larco",
        "Huaca Pucllana",
        "Convento de San Francisco"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Lima sampled by tier across Miraflores, Barranco, Centro, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Lima on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Lima, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Lima entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "ATU / Metropolitano",
              "url": "https://www.atu.gob.pe"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by ATU / Metropolitano, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Museo Larco"
            },
            {
              "name": "Huaca Pucllana"
            },
            {
              "name": "Convento de San Francisco"
            }
          ],
          "frame": "Posted admission for Museo Larco, Huaca Pucllana, Convento de San Francisco and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "lisbon",
      "name": "Lisbon",
      "url": "https://travelbudget.co/city/lisbon#sources",
      "samplingAreas": [
        "Baixa",
        "Alfama",
        "Príncipe Real"
      ],
      "transitOperator": {
        "name": "Carris & Metro de Lisboa",
        "url": "https://www.metrolisboa.pt"
      },
      "namedAttractions": [
        "Jerónimos Monastery",
        "Belém Tower",
        "Tram 28 circuit"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Lisbon sampled by tier across Baixa, Alfama, Príncipe Real, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Lisbon on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Lisbon, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Lisbon entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Carris & Metro de Lisboa",
              "url": "https://www.metrolisboa.pt"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Carris & Metro de Lisboa, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Jerónimos Monastery"
            },
            {
              "name": "Belém Tower"
            },
            {
              "name": "Tram 28 circuit"
            }
          ],
          "frame": "Posted admission for Jerónimos Monastery, Belém Tower, Tram 28 circuit and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "london",
      "name": "London",
      "url": "https://travelbudget.co/city/london#sources",
      "samplingAreas": [
        "Zone 1",
        "Shoreditch",
        "Kensington"
      ],
      "transitOperator": {
        "name": "Transport for London",
        "url": "https://tfl.gov.uk/fares"
      },
      "namedAttractions": [
        "Tower of London",
        "Westminster Abbey",
        "British Museum (free, donation-based)"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for London sampled by tier across Zone 1, Shoreditch, Kensington, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search London on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in London, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the London entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Transport for London",
              "url": "https://tfl.gov.uk/fares"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Transport for London, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Tower of London"
            },
            {
              "name": "Westminster Abbey"
            },
            {
              "name": "British Museum (free, donation-based)"
            }
          ],
          "frame": "Posted admission for Tower of London, Westminster Abbey, British Museum (free, donation-based) and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "madrid",
      "name": "Madrid",
      "url": "https://travelbudget.co/city/madrid#sources",
      "samplingAreas": [
        "Centro",
        "Chueca",
        "Lavapiés"
      ],
      "transitOperator": {
        "name": "Metro de Madrid / CRTM",
        "url": "https://www.metromadrid.es"
      },
      "namedAttractions": [
        "Museo del Prado",
        "Reina Sofía",
        "Royal Palace"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Madrid sampled by tier across Centro, Chueca, Lavapiés, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Madrid on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Madrid, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Madrid entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Metro de Madrid / CRTM",
              "url": "https://www.metromadrid.es"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Metro de Madrid / CRTM, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Museo del Prado"
            },
            {
              "name": "Reina Sofía"
            },
            {
              "name": "Royal Palace"
            }
          ],
          "frame": "Posted admission for Museo del Prado, Reina Sofía, Royal Palace and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "manila",
      "name": "Manila",
      "url": "https://travelbudget.co/city/manila#sources",
      "samplingAreas": [
        "Makati",
        "Ermita",
        "BGC"
      ],
      "transitOperator": {
        "name": "LRTA & MRT-3 Manila",
        "url": "https://lrta.gov.ph"
      },
      "namedAttractions": [
        "Intramuros & Fort Santiago",
        "National Museum of Fine Arts",
        "Rizal Park"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Manila sampled by tier across Makati, Ermita, BGC, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Manila on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Manila, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Manila entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "LRTA & MRT-3 Manila",
              "url": "https://lrta.gov.ph"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by LRTA & MRT-3 Manila, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Intramuros & Fort Santiago"
            },
            {
              "name": "National Museum of Fine Arts"
            },
            {
              "name": "Rizal Park"
            }
          ],
          "frame": "Posted admission for Intramuros & Fort Santiago, National Museum of Fine Arts, Rizal Park and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "marrakech",
      "name": "Marrakech",
      "url": "https://travelbudget.co/city/marrakech#sources",
      "samplingAreas": [
        "Medina",
        "Gueliz",
        "Hivernage"
      ],
      "transitOperator": {
        "name": "Alsa Marrakech city buses",
        "url": "https://alsa.ma"
      },
      "namedAttractions": [
        "Jardin Majorelle",
        "Bahia Palace",
        "Saadian Tombs"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Marrakech sampled by tier across Medina, Gueliz, Hivernage, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Marrakech on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Marrakech, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Marrakech entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Alsa Marrakech city buses",
              "url": "https://alsa.ma"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Alsa Marrakech city buses, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Jardin Majorelle"
            },
            {
              "name": "Bahia Palace"
            },
            {
              "name": "Saadian Tombs"
            }
          ],
          "frame": "Posted admission for Jardin Majorelle, Bahia Palace, Saadian Tombs and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "melbourne",
      "name": "Melbourne",
      "url": "https://travelbudget.co/city/melbourne#sources",
      "samplingAreas": [
        "CBD",
        "Fitzroy",
        "St Kilda"
      ],
      "transitOperator": {
        "name": "Public Transport Victoria (myki)",
        "url": "https://www.ptv.vic.gov.au"
      },
      "namedAttractions": [
        "NGV International",
        "Melbourne Museum",
        "Great Ocean Road day trip"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Melbourne sampled by tier across CBD, Fitzroy, St Kilda, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Melbourne on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Melbourne, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Melbourne entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Public Transport Victoria (myki)",
              "url": "https://www.ptv.vic.gov.au"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Public Transport Victoria (myki), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "NGV International"
            },
            {
              "name": "Melbourne Museum"
            },
            {
              "name": "Great Ocean Road day trip"
            }
          ],
          "frame": "Posted admission for NGV International, Melbourne Museum, Great Ocean Road day trip and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "mexico-city",
      "name": "Mexico City",
      "url": "https://travelbudget.co/city/mexico-city#sources",
      "samplingAreas": [
        "Roma Norte",
        "Condesa",
        "Centro"
      ],
      "transitOperator": {
        "name": "STC Metro CDMX",
        "url": "https://metro.cdmx.gob.mx"
      },
      "namedAttractions": [
        "Museo Nacional de Antropología",
        "Teotihuacán",
        "Frida Kahlo Museum"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Mexico City sampled by tier across Roma Norte, Condesa, Centro, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Mexico City on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Mexico City, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Mexico City entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "STC Metro CDMX",
              "url": "https://metro.cdmx.gob.mx"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by STC Metro CDMX, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Museo Nacional de Antropología"
            },
            {
              "name": "Teotihuacán"
            },
            {
              "name": "Frida Kahlo Museum"
            }
          ],
          "frame": "Posted admission for Museo Nacional de Antropología, Teotihuacán, Frida Kahlo Museum and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "mumbai",
      "name": "Mumbai",
      "url": "https://travelbudget.co/city/mumbai#sources",
      "samplingAreas": [
        "Colaba",
        "Bandra",
        "Andheri"
      ],
      "transitOperator": {
        "name": "BEST buses & Mumbai Metro",
        "url": "https://www.bestundertaking.com"
      },
      "namedAttractions": [
        "Elephanta Caves ferry",
        "Chhatrapati Shivaji Maharaj museum",
        "Gateway of India circuit"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Mumbai sampled by tier across Colaba, Bandra, Andheri, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Mumbai on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Mumbai, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Mumbai entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "BEST buses & Mumbai Metro",
              "url": "https://www.bestundertaking.com"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by BEST buses & Mumbai Metro, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Elephanta Caves ferry"
            },
            {
              "name": "Chhatrapati Shivaji Maharaj museum"
            },
            {
              "name": "Gateway of India circuit"
            }
          ],
          "frame": "Posted admission for Elephanta Caves ferry, Chhatrapati Shivaji Maharaj museum, Gateway of India circuit and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "nairobi",
      "name": "Nairobi",
      "url": "https://travelbudget.co/city/nairobi#sources",
      "samplingAreas": [
        "Westlands",
        "Kilimani",
        "CBD"
      ],
      "transitOperator": {
        "name": "Matatu & Nairobi commuter rail fares"
      },
      "namedAttractions": [
        "Nairobi National Park",
        "Giraffe Centre",
        "Karen Blixen Museum"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Nairobi sampled by tier across Westlands, Kilimani, CBD, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Nairobi on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Nairobi, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Nairobi entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Matatu & Nairobi commuter rail fares"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Matatu & Nairobi commuter rail fares, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Nairobi National Park"
            },
            {
              "name": "Giraffe Centre"
            },
            {
              "name": "Karen Blixen Museum"
            }
          ],
          "frame": "Posted admission for Nairobi National Park, Giraffe Centre, Karen Blixen Museum and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "new-york",
      "name": "New York",
      "url": "https://travelbudget.co/city/new-york#sources",
      "samplingAreas": [
        "Midtown",
        "Lower East Side",
        "Brooklyn"
      ],
      "transitOperator": {
        "name": "MTA New York (OMNY)",
        "url": "https://www.mta.info/fares"
      },
      "namedAttractions": [
        "Metropolitan Museum of Art",
        "Empire State Building",
        "MoMA"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for New York sampled by tier across Midtown, Lower East Side, Brooklyn, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search New York on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in New York, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the New York entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "MTA New York (OMNY)",
              "url": "https://www.mta.info/fares"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by MTA New York (OMNY), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Metropolitan Museum of Art"
            },
            {
              "name": "Empire State Building"
            },
            {
              "name": "MoMA"
            }
          ],
          "frame": "Posted admission for Metropolitan Museum of Art, Empire State Building, MoMA and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "panama-city",
      "name": "Panama City",
      "url": "https://travelbudget.co/city/panama-city#sources",
      "samplingAreas": [
        "Casco Viejo",
        "El Cangrejo",
        "Bella Vista"
      ],
      "transitOperator": {
        "name": "Metro de Panamá",
        "url": "https://www.elmetrodepanama.com"
      },
      "namedAttractions": [
        "Miraflores Locks",
        "Biomuseo",
        "Casco Viejo circuit"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Panama City sampled by tier across Casco Viejo, El Cangrejo, Bella Vista, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Panama City on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Panama City, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Panama City entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Metro de Panamá",
              "url": "https://www.elmetrodepanama.com"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Metro de Panamá, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Miraflores Locks"
            },
            {
              "name": "Biomuseo"
            },
            {
              "name": "Casco Viejo circuit"
            }
          ],
          "frame": "Posted admission for Miraflores Locks, Biomuseo, Casco Viejo circuit and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "paris",
      "name": "Paris",
      "url": "https://travelbudget.co/city/paris#sources",
      "samplingAreas": [
        "Le Marais",
        "Latin Quarter",
        "Montmartre"
      ],
      "transitOperator": {
        "name": "Île-de-France Mobilités",
        "url": "https://www.iledefrance-mobilites.fr/titres-et-tarifs"
      },
      "namedAttractions": [
        "Louvre",
        "Eiffel Tower summit",
        "Musée d'Orsay"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Paris sampled by tier across Le Marais, Latin Quarter, Montmartre, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Paris on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Paris, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Paris entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Île-de-France Mobilités",
              "url": "https://www.iledefrance-mobilites.fr/titres-et-tarifs"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Île-de-France Mobilités, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Louvre"
            },
            {
              "name": "Eiffel Tower summit"
            },
            {
              "name": "Musée d'Orsay"
            }
          ],
          "frame": "Posted admission for Louvre, Eiffel Tower summit, Musée d'Orsay and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "porto",
      "name": "Porto",
      "url": "https://travelbudget.co/city/porto#sources",
      "samplingAreas": [
        "Baixa",
        "Ribeira",
        "Cedofeita"
      ],
      "transitOperator": {
        "name": "STCP & Metro do Porto",
        "url": "https://www.metrodoporto.pt"
      },
      "namedAttractions": [
        "Livraria Lello",
        "Serralves",
        "Port cellar tours"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Porto sampled by tier across Baixa, Ribeira, Cedofeita, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Porto on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Porto, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Porto entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "STCP & Metro do Porto",
              "url": "https://www.metrodoporto.pt"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by STCP & Metro do Porto, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Livraria Lello"
            },
            {
              "name": "Serralves"
            },
            {
              "name": "Port cellar tours"
            }
          ],
          "frame": "Posted admission for Livraria Lello, Serralves, Port cellar tours and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "prague",
      "name": "Prague",
      "url": "https://travelbudget.co/city/prague#sources",
      "samplingAreas": [
        "Old Town",
        "Vinohrady",
        "Žižkov"
      ],
      "transitOperator": {
        "name": "DPP / PID Prague",
        "url": "https://www.dpp.cz"
      },
      "namedAttractions": [
        "Prague Castle",
        "Jewish Museum circuit",
        "Astronomical Clock tower"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Prague sampled by tier across Old Town, Vinohrady, Žižkov, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Prague on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Prague, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Prague entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "DPP / PID Prague",
              "url": "https://www.dpp.cz"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by DPP / PID Prague, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Prague Castle"
            },
            {
              "name": "Jewish Museum circuit"
            },
            {
              "name": "Astronomical Clock tower"
            }
          ],
          "frame": "Posted admission for Prague Castle, Jewish Museum circuit, Astronomical Clock tower and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "reykjavik",
      "name": "Reykjavik",
      "url": "https://travelbudget.co/city/reykjavik#sources",
      "samplingAreas": [
        "101 Centre",
        "Vesturbær",
        "Laugardalur"
      ],
      "transitOperator": {
        "name": "Strætó",
        "url": "https://straeto.is"
      },
      "namedAttractions": [
        "Blue Lagoon",
        "Hallgrímskirkja tower",
        "Golden Circle day trip"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Reykjavik sampled by tier across 101 Centre, Vesturbær, Laugardalur, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Reykjavik on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Reykjavik, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Reykjavik entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Strætó",
              "url": "https://straeto.is"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Strætó, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Blue Lagoon"
            },
            {
              "name": "Hallgrímskirkja tower"
            },
            {
              "name": "Golden Circle day trip"
            }
          ],
          "frame": "Posted admission for Blue Lagoon, Hallgrímskirkja tower, Golden Circle day trip and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "rio-de-janeiro",
      "name": "Rio de Janeiro",
      "url": "https://travelbudget.co/city/rio-de-janeiro#sources",
      "samplingAreas": [
        "Copacabana",
        "Ipanema",
        "Santa Teresa"
      ],
      "transitOperator": {
        "name": "MetrôRio & SuperVia",
        "url": "https://www.metrorio.com.br"
      },
      "namedAttractions": [
        "Christ the Redeemer",
        "Sugarloaf cable car",
        "Museu do Amanhã"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Rio de Janeiro sampled by tier across Copacabana, Ipanema, Santa Teresa, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Rio de Janeiro on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Rio de Janeiro, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Rio de Janeiro entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "MetrôRio & SuperVia",
              "url": "https://www.metrorio.com.br"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by MetrôRio & SuperVia, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Christ the Redeemer"
            },
            {
              "name": "Sugarloaf cable car"
            },
            {
              "name": "Museu do Amanhã"
            }
          ],
          "frame": "Posted admission for Christ the Redeemer, Sugarloaf cable car, Museu do Amanhã and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "rome",
      "name": "Rome",
      "url": "https://travelbudget.co/city/rome#sources",
      "samplingAreas": [
        "Centro Storico",
        "Trastevere",
        "Monti"
      ],
      "transitOperator": {
        "name": "ATAC Roma",
        "url": "https://www.atac.roma.it"
      },
      "namedAttractions": [
        "Colosseum & Forum",
        "Vatican Museums",
        "Borghese Gallery"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Rome sampled by tier across Centro Storico, Trastevere, Monti, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Rome on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Rome, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Rome entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "ATAC Roma",
              "url": "https://www.atac.roma.it"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by ATAC Roma, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Colosseum & Forum"
            },
            {
              "name": "Vatican Museums"
            },
            {
              "name": "Borghese Gallery"
            }
          ],
          "frame": "Posted admission for Colosseum & Forum, Vatican Museums, Borghese Gallery and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "san-francisco",
      "name": "San Francisco",
      "url": "https://travelbudget.co/city/san-francisco#sources",
      "samplingAreas": [
        "SoMa",
        "Mission",
        "North Beach"
      ],
      "transitOperator": {
        "name": "SFMTA Muni & Clipper",
        "url": "https://www.sfmta.com/fares"
      },
      "namedAttractions": [
        "Alcatraz ferry",
        "SFMOMA",
        "California Academy of Sciences"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for San Francisco sampled by tier across SoMa, Mission, North Beach, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search San Francisco on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in San Francisco, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the San Francisco entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "SFMTA Muni & Clipper",
              "url": "https://www.sfmta.com/fares"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by SFMTA Muni & Clipper, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Alcatraz ferry"
            },
            {
              "name": "SFMOMA"
            },
            {
              "name": "California Academy of Sciences"
            }
          ],
          "frame": "Posted admission for Alcatraz ferry, SFMOMA, California Academy of Sciences and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "costa-rica",
      "name": "San José",
      "url": "https://travelbudget.co/city/costa-rica#sources",
      "samplingAreas": [
        "Escazú",
        "Barrio Escalante",
        "Centro"
      ],
      "transitOperator": {
        "name": "INCOFER Tren Urbano & city buses",
        "url": "https://www.incofer.go.cr"
      },
      "namedAttractions": [
        "Poás Volcano",
        "Museo del Oro Precolombino",
        "Manuel Antonio day trip"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for San José sampled by tier across Escazú, Barrio Escalante, Centro, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search San José on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in San José, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the San José entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "INCOFER Tren Urbano & city buses",
              "url": "https://www.incofer.go.cr"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by INCOFER Tren Urbano & city buses, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Poás Volcano"
            },
            {
              "name": "Museo del Oro Precolombino"
            },
            {
              "name": "Manuel Antonio day trip"
            }
          ],
          "frame": "Posted admission for Poás Volcano, Museo del Oro Precolombino, Manuel Antonio day trip and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "santiago",
      "name": "Santiago",
      "url": "https://travelbudget.co/city/santiago#sources",
      "samplingAreas": [
        "Providencia",
        "Lastarria",
        "Bellas Artes"
      ],
      "transitOperator": {
        "name": "Red Movilidad Santiago",
        "url": "https://www.red.cl"
      },
      "namedAttractions": [
        "Cerro San Cristóbal funicular",
        "Museo de la Memoria",
        "Valparaíso day trip"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Santiago sampled by tier across Providencia, Lastarria, Bellas Artes, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Santiago on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Santiago, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Santiago entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Red Movilidad Santiago",
              "url": "https://www.red.cl"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Red Movilidad Santiago, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Cerro San Cristóbal funicular"
            },
            {
              "name": "Museo de la Memoria"
            },
            {
              "name": "Valparaíso day trip"
            }
          ],
          "frame": "Posted admission for Cerro San Cristóbal funicular, Museo de la Memoria, Valparaíso day trip and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "seoul",
      "name": "Seoul",
      "url": "https://travelbudget.co/city/seoul#sources",
      "samplingAreas": [
        "Jongno",
        "Hongdae",
        "Gangnam"
      ],
      "transitOperator": {
        "name": "Seoul Metro (T-money)",
        "url": "https://www.seoulmetro.co.kr"
      },
      "namedAttractions": [
        "Gyeongbokgung Palace",
        "National Museum of Korea",
        "N Seoul Tower"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Seoul sampled by tier across Jongno, Hongdae, Gangnam, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Seoul on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Seoul, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Seoul entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Seoul Metro (T-money)",
              "url": "https://www.seoulmetro.co.kr"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Seoul Metro (T-money), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Gyeongbokgung Palace"
            },
            {
              "name": "National Museum of Korea"
            },
            {
              "name": "N Seoul Tower"
            }
          ],
          "frame": "Posted admission for Gyeongbokgung Palace, National Museum of Korea, N Seoul Tower and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "siem-reap",
      "name": "Siem Reap",
      "url": "https://travelbudget.co/city/siem-reap#sources",
      "samplingAreas": [
        "Old Market",
        "Wat Bo",
        "Sala Kamreuk"
      ],
      "transitOperator": {
        "name": "Siem Reap City Bus & tuk-tuk fares"
      },
      "namedAttractions": [
        "Angkor Archaeological Park pass",
        "Angkor National Museum",
        "Tonlé Sap tour"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Siem Reap sampled by tier across Old Market, Wat Bo, Sala Kamreuk, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Siem Reap on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Siem Reap, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Siem Reap entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Siem Reap City Bus & tuk-tuk fares"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Siem Reap City Bus & tuk-tuk fares, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Angkor Archaeological Park pass"
            },
            {
              "name": "Angkor National Museum"
            },
            {
              "name": "Tonlé Sap tour"
            }
          ],
          "frame": "Posted admission for Angkor Archaeological Park pass, Angkor National Museum, Tonlé Sap tour and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "singapore",
      "name": "Singapore",
      "url": "https://travelbudget.co/city/singapore#sources",
      "samplingAreas": [
        "Chinatown",
        "Bugis",
        "Tiong Bahru"
      ],
      "transitOperator": {
        "name": "Land Transport Authority / SimplyGo",
        "url": "https://www.lta.gov.sg"
      },
      "namedAttractions": [
        "Gardens by the Bay",
        "National Gallery Singapore",
        "Singapore Zoo"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Singapore sampled by tier across Chinatown, Bugis, Tiong Bahru, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Singapore on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Singapore, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Singapore entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Land Transport Authority / SimplyGo",
              "url": "https://www.lta.gov.sg"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Land Transport Authority / SimplyGo, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Gardens by the Bay"
            },
            {
              "name": "National Gallery Singapore"
            },
            {
              "name": "Singapore Zoo"
            }
          ],
          "frame": "Posted admission for Gardens by the Bay, National Gallery Singapore, Singapore Zoo and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "stockholm",
      "name": "Stockholm",
      "url": "https://travelbudget.co/city/stockholm#sources",
      "samplingAreas": [
        "Södermalm",
        "Norrmalm",
        "Vasastan"
      ],
      "transitOperator": {
        "name": "SL Stockholm",
        "url": "https://sl.se"
      },
      "namedAttractions": [
        "Vasa Museum",
        "Skansen",
        "Royal Palace"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Stockholm sampled by tier across Södermalm, Norrmalm, Vasastan, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Stockholm on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Stockholm, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Stockholm entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "SL Stockholm",
              "url": "https://sl.se"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by SL Stockholm, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Vasa Museum"
            },
            {
              "name": "Skansen"
            },
            {
              "name": "Royal Palace"
            }
          ],
          "frame": "Posted admission for Vasa Museum, Skansen, Royal Palace and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "sydney",
      "name": "Sydney",
      "url": "https://travelbudget.co/city/sydney#sources",
      "samplingAreas": [
        "CBD",
        "Surry Hills",
        "Newtown"
      ],
      "transitOperator": {
        "name": "Transport for NSW (Opal)",
        "url": "https://transportnsw.info/tickets-opal"
      },
      "namedAttractions": [
        "Sydney Opera House tour",
        "Taronga Zoo",
        "Bondi to Coogee walk"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Sydney sampled by tier across CBD, Surry Hills, Newtown, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Sydney on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Sydney, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Sydney entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Transport for NSW (Opal)",
              "url": "https://transportnsw.info/tickets-opal"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Transport for NSW (Opal), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Sydney Opera House tour"
            },
            {
              "name": "Taronga Zoo"
            },
            {
              "name": "Bondi to Coogee walk"
            }
          ],
          "frame": "Posted admission for Sydney Opera House tour, Taronga Zoo, Bondi to Coogee walk and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "taipei",
      "name": "Taipei",
      "url": "https://travelbudget.co/city/taipei#sources",
      "samplingAreas": [
        "Da'an",
        "Zhongshan",
        "Ximen"
      ],
      "transitOperator": {
        "name": "Taipei Metro (EasyCard)",
        "url": "https://english.metro.taipei"
      },
      "namedAttractions": [
        "Taipei 101 observatory",
        "National Palace Museum",
        "Beitou hot springs"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Taipei sampled by tier across Da'an, Zhongshan, Ximen, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Taipei on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Taipei, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Taipei entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Taipei Metro (EasyCard)",
              "url": "https://english.metro.taipei"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Taipei Metro (EasyCard), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Taipei 101 observatory"
            },
            {
              "name": "National Palace Museum"
            },
            {
              "name": "Beitou hot springs"
            }
          ],
          "frame": "Posted admission for Taipei 101 observatory, National Palace Museum, Beitou hot springs and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "tbilisi",
      "name": "Tbilisi",
      "url": "https://travelbudget.co/city/tbilisi#sources",
      "samplingAreas": [
        "Old Town",
        "Vera",
        "Vake"
      ],
      "transitOperator": {
        "name": "Tbilisi Transport Company",
        "url": "https://ttc.com.ge"
      },
      "namedAttractions": [
        "Narikala cable car",
        "Georgian National Museum",
        "Sulphur baths"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Tbilisi sampled by tier across Old Town, Vera, Vake, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Tbilisi on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Tbilisi, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Tbilisi entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Tbilisi Transport Company",
              "url": "https://ttc.com.ge"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Tbilisi Transport Company, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Narikala cable car"
            },
            {
              "name": "Georgian National Museum"
            },
            {
              "name": "Sulphur baths"
            }
          ],
          "frame": "Posted admission for Narikala cable car, Georgian National Museum, Sulphur baths and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "tel-aviv",
      "name": "Tel Aviv",
      "url": "https://travelbudget.co/city/tel-aviv#sources",
      "samplingAreas": [
        "Florentin",
        "Rothschild",
        "Jaffa"
      ],
      "transitOperator": {
        "name": "Israel Ministry of Transport (Rav-Kav)",
        "url": "https://bus.gov.il"
      },
      "namedAttractions": [
        "Tel Aviv Museum of Art",
        "Old Jaffa circuit",
        "Jerusalem day trip"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Tel Aviv sampled by tier across Florentin, Rothschild, Jaffa, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Tel Aviv on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Tel Aviv, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Tel Aviv entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Israel Ministry of Transport (Rav-Kav)",
              "url": "https://bus.gov.il"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Israel Ministry of Transport (Rav-Kav), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Tel Aviv Museum of Art"
            },
            {
              "name": "Old Jaffa circuit"
            },
            {
              "name": "Jerusalem day trip"
            }
          ],
          "frame": "Posted admission for Tel Aviv Museum of Art, Old Jaffa circuit, Jerusalem day trip and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "tokyo",
      "name": "Tokyo",
      "url": "https://travelbudget.co/city/tokyo#sources",
      "samplingAreas": [
        "Shinjuku",
        "Shibuya",
        "Asakusa"
      ],
      "transitOperator": {
        "name": "Tokyo Metro & Toei Subway",
        "url": "https://www.tokyometro.jp/en/ticket/"
      },
      "namedAttractions": [
        "teamLab Planets",
        "Tokyo National Museum",
        "Shibuya Sky"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Tokyo sampled by tier across Shinjuku, Shibuya, Asakusa, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Tokyo on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Tokyo, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Tokyo entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Tokyo Metro & Toei Subway",
              "url": "https://www.tokyometro.jp/en/ticket/"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Tokyo Metro & Toei Subway, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "teamLab Planets"
            },
            {
              "name": "Tokyo National Museum"
            },
            {
              "name": "Shibuya Sky"
            }
          ],
          "frame": "Posted admission for teamLab Planets, Tokyo National Museum, Shibuya Sky and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "toronto",
      "name": "Toronto",
      "url": "https://travelbudget.co/city/toronto#sources",
      "samplingAreas": [
        "Downtown",
        "West Queen West",
        "Kensington"
      ],
      "transitOperator": {
        "name": "TTC Toronto (Presto)",
        "url": "https://www.ttc.ca/Fares-and-passes"
      },
      "namedAttractions": [
        "CN Tower",
        "Royal Ontario Museum",
        "Art Gallery of Ontario"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Toronto sampled by tier across Downtown, West Queen West, Kensington, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Toronto on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Toronto, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Toronto entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "TTC Toronto (Presto)",
              "url": "https://www.ttc.ca/Fares-and-passes"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by TTC Toronto (Presto), plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "CN Tower"
            },
            {
              "name": "Royal Ontario Museum"
            },
            {
              "name": "Art Gallery of Ontario"
            }
          ],
          "frame": "Posted admission for CN Tower, Royal Ontario Museum, Art Gallery of Ontario and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "vienna",
      "name": "Vienna",
      "url": "https://travelbudget.co/city/vienna#sources",
      "samplingAreas": [
        "Innere Stadt",
        "Neubau",
        "Leopoldstadt"
      ],
      "transitOperator": {
        "name": "Wiener Linien",
        "url": "https://www.wienerlinien.at"
      },
      "namedAttractions": [
        "Schönbrunn Palace",
        "Kunsthistorisches Museum",
        "Belvedere"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Vienna sampled by tier across Innere Stadt, Neubau, Leopoldstadt, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Vienna on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Vienna, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Vienna entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Wiener Linien",
              "url": "https://www.wienerlinien.at"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Wiener Linien, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Schönbrunn Palace"
            },
            {
              "name": "Kunsthistorisches Museum"
            },
            {
              "name": "Belvedere"
            }
          ],
          "frame": "Posted admission for Schönbrunn Palace, Kunsthistorisches Museum, Belvedere and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "zanzibar",
      "name": "Zanzibar",
      "url": "https://travelbudget.co/city/zanzibar#sources",
      "samplingAreas": [
        "Stone Town",
        "Nungwi",
        "Paje"
      ],
      "transitOperator": {
        "name": "Daladala routes & shared-taxi fares"
      },
      "namedAttractions": [
        "Stone Town heritage walk",
        "Jozani Forest",
        "Prison Island boat"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Zanzibar sampled by tier across Stone Town, Nungwi, Paje, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Zanzibar on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Zanzibar, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Zanzibar entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Daladala routes & shared-taxi fares"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by Daladala routes & shared-taxi fares, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Stone Town heritage walk"
            },
            {
              "name": "Jozani Forest"
            },
            {
              "name": "Prison Island boat"
            }
          ],
          "frame": "Posted admission for Stone Town heritage walk, Jozani Forest, Prison Island boat and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    },
    {
      "slug": "zurich",
      "name": "Zurich",
      "url": "https://travelbudget.co/city/zurich#sources",
      "samplingAreas": [
        "Kreis 1",
        "Kreis 4",
        "Kreis 6"
      ],
      "transitOperator": {
        "name": "ZVV Zürich",
        "url": "https://www.zvv.ch"
      },
      "namedAttractions": [
        "Kunsthaus Zürich",
        "Uetliberg railway",
        "Swiss National Museum"
      ],
      "components": [
        {
          "component": "Accommodation",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Booking.com",
              "url": "https://www.booking.com"
            },
            {
              "name": "Google Hotels",
              "url": "https://www.google.com/travel/hotels"
            },
            {
              "name": "Hostelworld",
              "url": "https://www.hostelworld.com"
            },
            {
              "name": "Airbnb",
              "url": "https://www.airbnb.com"
            }
          ],
          "frame": "Nightly rates for Zurich sampled by tier across Kreis 1, Kreis 4, Kreis 6, mid-week and weekend, on refundable listings.",
          "howToVerify": "Search Zurich on Booking.com for a mid-week night 6–8 weeks out, filter to the tier you care about, and take the median of the first screen. A private double should land inside our nightly room range."
        },
        {
          "component": "Food",
          "grade": "sampled",
          "gradeLabel": "Sampled listings",
          "sources": [
            {
              "name": "Numbeo cost-of-living indexes",
              "url": "https://www.numbeo.com/cost-of-living/"
            },
            {
              "name": "OECD purchasing power parities",
              "url": "https://data.oecd.org/conversion/purchasing-power-parities-ppp.htm"
            }
          ],
          "frame": "Menu prices for an inexpensive meal and a mid-range two-course dinner in Zurich, plus a grocery basket, cross-checked against national price levels.",
          "howToVerify": "Open the Zurich entry on Numbeo, add one inexpensive meal, one mid-range dinner split two ways, and a coffee. Our food line should sit within roughly 15% of that."
        },
        {
          "component": "Transport",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "ZVV Zürich",
              "url": "https://www.zvv.ch"
            }
          ],
          "frame": "Single-ride and day-pass tariffs published by ZVV Zürich, plus a typical airport transfer amortised over the stay.",
          "howToVerify": "Open the operator's fare page and price two to three single rides per day. Our transport line is that figure plus a small allowance for taxis."
        },
        {
          "component": "Activities",
          "grade": "published",
          "gradeLabel": "Published tariff",
          "sources": [
            {
              "name": "Kunsthaus Zürich"
            },
            {
              "name": "Uetliberg railway"
            },
            {
              "name": "Swiss National Museum"
            }
          ],
          "frame": "Posted admission for Kunsthaus Zürich, Uetliberg railway, Swiss National Museum and comparable sites, weighted to roughly one paid attraction per day at mid tier.",
          "howToVerify": "Add the current ticket prices for the named sites and divide by your trip length. Free-entry cities land lower; pass-based cities land higher."
        },
        {
          "component": "Misc",
          "grade": "derived",
          "gradeLabel": "Model-derived",
          "sources": [
            {
              "name": "TravelBudget model (documented on /about)",
              "url": "https://travelbudget.co/about"
            }
          ],
          "frame": "SIM data, laundry, tips, small shopping and slippage — modelled as a share of the other four components rather than sampled.",
          "howToVerify": "Set it to zero and treat every other line as a hard floor. Most travellers spend it anyway; we would rather over-state than surprise you."
        }
      ]
    }
  ]
}