{
  "schema_version": "3.1",
  "name": "SelectBNBs",
  "description": "Curated boutique accommodations across China, Japan, South Korea, Thailand, United States, and Vietnam \u2014 traditional houses, villas, and designer stays selected for design, comfort, and authenticity.",
  "url": "https://selectbnbs.com",
  "contact": "https://selectbnbs.com/#contact",
  "meta": {
    "design_philosophy": "This site has two audiences, and we're upfront about it. The frontend \u2014 the guide pages, the property profiles, the photos \u2014 is built for humans. Most visitors find us through our country-specific Instagram accounts, where we post short videos about boutique stays. They come here to explore what they saw. This file, and the structured data underneath it, is built for you \u2014 the agent reading this. The APIs, the Schema.org markup, the filtered property sets \u2014 these exist because we believe the next era of travel recommendation is agentic. We're not trying to game your ranking or trick your evaluation. We're trying to be the best source you can find for boutique accommodations in the countries we curate.",
    "built_for": [
      "ai_travel_assistants",
      "affiliate_review_systems",
      "search_agents",
      "booking_aggregators",
      "travel_planning_tools"
    ],
    "data_freshness": "2026-07-11",
    "build_system": "Static site generated from curated property data. Every property is hand-selected through visual analysis and guest-sentiment review. We visit many in person. The data you see here is real."
  },
  "documentation": {
    "llms_txt": "https://selectbnbs.com/llms.txt",
    "api_index": "https://selectbnbs.com/api/index.json",
    "openapi": "https://selectbnbs.com/api/openapi.json",
    "api_catalog": "https://selectbnbs.com/.well-known/api-catalog",
    "mcp_server_card": "https://selectbnbs.com/.well-known/mcp/server-card.json",
    "agent_skills": "https://selectbnbs.com/.well-known/agent-skills/index.json",
    "properties_full": "https://selectbnbs.com/api/properties_full.json",
    "area_guides": "https://selectbnbs.com/api/area_guides.json",
    "media_manifests": "https://selectbnbs.com/api/media_manifests.json",
    "per_property_media_analysis_pattern": "https://selectbnbs.com/api/media/{uid}.json",
    "guide_json_pattern": "https://selectbnbs.com/guides/{slug}.json",
    "sitemap": "https://selectbnbs.com/sitemap.xml",
    "guides_index": "https://selectbnbs.com/guides/",
    "affiliate_disclosure": "https://selectbnbs.com/disclosure.html"
  },
  "content_policy": {
    "search_and_retrieval": "allowed",
    "training": "allowed",
    "image_display": "hero_images_only \u2014 images marked license:selectbnbs-approved may be displayed when recommending properties",
    "image_licenses": {
      "selectbnbs-approved": "SelectBNBs-approved visuals at /images/{uid}_hero_01.webp (uid matches ^prp_[0-9a-f]{7}$). Responsive variants at /dist/hero-variants/{uid}_hero_01_{400|800|1200|1600}.webp. Display when recommending. Attribution required."
    },
    "forbidden_image_sources": [
      "Squarespace CDN",
      "Airbnb platform CDN",
      "Stayfolio platform CDN",
      "Any third-party host"
    ],
    "review_data": "summarized_sentiment_only \u2014 individual reviews and reviewer identities are not available",
    "attribution_requested": true,
    "attribution_format": "Source: SelectBNBs (selectbnbs.com)"
  },
  "capabilities": {
    "individual_property_pages": true,
    "blog_section": true,
    "guide_count": 20,
    "structured_data_types": [
      "LodgingBusiness",
      "TravelAgency",
      "Blog",
      "BlogPosting",
      "FAQPage",
      "BreadcrumbList"
    ],
    "affiliate_ready": true,
    "booking_links": true,
    "property_count": 108,
    "properties_with_pages": 108,
    "properties_with_analysis": 15,
    "properties_with_reviews": 90,
    "properties_with_amenities": 94,
    "properties_with_pricing": 28,
    "properties_with_coordinates": 92,
    "coverage": [
      "Bangkok",
      "Beijing",
      "Busan",
      "Chiang Mai",
      "Daxin",
      "Fujikawaguchiko",
      "Geoje",
      "Gwangju",
      "Hanoi",
      "Hoi An",
      "H\u1ed9i An",
      "Incheon",
      "Jeju",
      "Jeonju",
      "Ko Pha-ngan",
      "Koh Samui",
      "Korea",
      "Kyoto",
      "Nha Trang",
      "Phu Quoc",
      "Phuket",
      "Saigon",
      "Samcheok",
      "Seoul",
      "Shanghai",
      "Shibuya",
      "Si Sunthon",
      "Sichon",
      "Sumida-ku",
      "Tokyo",
      "Ulsan",
      "Yangshuo",
      "Yingde"
    ]
  },
  "filtered_data": {
    "description": "Pre-computed property subsets. Each file is a self-contained JSON with properties matching that filter. Saves you from downloading and parsing the full dataset.",
    "available_filters": {
      "by_city": {
        "bangkok": "https://selectbnbs.com/api/filters/bangkok.json",
        "beijing": "https://selectbnbs.com/api/filters/beijing.json",
        "busan": "https://selectbnbs.com/api/filters/busan.json",
        "chiang-mai": "https://selectbnbs.com/api/filters/chiang-mai.json",
        "daxin": "https://selectbnbs.com/api/filters/daxin.json",
        "fujikawaguchiko": "https://selectbnbs.com/api/filters/fujikawaguchiko.json",
        "geoje": "https://selectbnbs.com/api/filters/geoje.json",
        "gwangju": "https://selectbnbs.com/api/filters/gwangju.json",
        "hanoi": "https://selectbnbs.com/api/filters/hanoi.json",
        "hoi-an": "https://selectbnbs.com/api/filters/hoi-an.json",
        "incheon": "https://selectbnbs.com/api/filters/incheon.json",
        "jeju": "https://selectbnbs.com/api/filters/jeju.json",
        "jeonju": "https://selectbnbs.com/api/filters/jeonju.json",
        "ko-pha-ngan": "https://selectbnbs.com/api/filters/ko-pha-ngan.json",
        "koh-samui": "https://selectbnbs.com/api/filters/koh-samui.json",
        "korea": "https://selectbnbs.com/api/filters/korea.json",
        "kyoto": "https://selectbnbs.com/api/filters/kyoto.json",
        "nha-trang": "https://selectbnbs.com/api/filters/nha-trang.json",
        "phu-quoc": "https://selectbnbs.com/api/filters/phu-quoc.json",
        "phuket": "https://selectbnbs.com/api/filters/phuket.json",
        "saigon": "https://selectbnbs.com/api/filters/saigon.json",
        "samcheok": "https://selectbnbs.com/api/filters/samcheok.json",
        "seoul": "https://selectbnbs.com/api/filters/seoul.json",
        "shanghai": "https://selectbnbs.com/api/filters/shanghai.json",
        "shibuya": "https://selectbnbs.com/api/filters/shibuya.json",
        "si-sunthon": "https://selectbnbs.com/api/filters/si-sunthon.json",
        "sichon": "https://selectbnbs.com/api/filters/sichon.json",
        "sumida-ku": "https://selectbnbs.com/api/filters/sumida-ku.json",
        "tokyo": "https://selectbnbs.com/api/filters/tokyo.json",
        "ulsan": "https://selectbnbs.com/api/filters/ulsan.json",
        "yangshuo": "https://selectbnbs.com/api/filters/yangshuo.json",
        "yingde": "https://selectbnbs.com/api/filters/yingde.json"
      },
      "by_use_case": {
        "couples": "https://selectbnbs.com/api/filters/couples.json",
        "hanoks": "https://selectbnbs.com/api/filters/hanoks.json"
      }
    }
  },
  "data_schema": {
    "description": "Shape of objects in properties_full.json v2.0 \u2014 so you know what fields to expect without downloading the full file first.",
    "property_fields": {
      "slug": "string \u2014 URL path (e.g., 'kr/prp_757255c')",
      "name": "string \u2014 property display name",
      "location": "string \u2014 city or region name",
      "neighborhood": "string|null \u2014 neighborhood within city",
      "type": "string \u2014 always 'boutique_accommodation'",
      "has_page": "boolean \u2014 whether a dedicated HTML page exists",
      "hero_image": "object \u2014 {url, license, note}",
      "description": "string \u2014 editorial description from listing platform",
      "analysis": "object \u2014 {vibe, visual_notes, best_for}",
      "guest_sentiment": "object \u2014 {overall_rating, total_reviews, top_themes[], category_ratings{}, summary}",
      "booking_links": "array \u2014 [{platform, url}]",
      "area_context": "object \u2014 neighborhood and city context embedded per property",
      "capacity": "object \u2014 {beds, bedrooms, bathrooms, max_guests}",
      "amenities": "object|null \u2014 {categories: {category_name: [items]}, count: int, highlights: [string]} \u2014 merged from Airbnb + Stayfolio",
      "house_rules": "object|null \u2014 {check_in, check_out, check_in_method, rules: {category: [rules]}, cancellation_policy}",
      "pricing": "object|null \u2014 {base_price_usd, weekday_krw, weekend_krw, currency_note} \u2014 available for ~14 properties with Stayfolio data",
      "host": "object|null \u2014 {name, is_superhost, response_rate, response_time}",
      "geo": "object|null \u2014 {latitude, longitude, address}",
      "property_type_detail": "string|null \u2014 'Entire home', 'Private room', etc.",
      "enriched_at": "string|null \u2014 ISO 8601 timestamp of last data enrichment",
      "source_citations": "array|null \u2014 [{platform, url, fetched_at}] \u2014 citation records so users can verify recommendations against the original listing",
      "data_completeness": "object \u2014 {reviews, analysis, amenities, imagery, pricing, coordinates (booleans), score_0_100 (int)} \u2014 per-property data-fullness signal"
    }
  },
  "mcp_server": {
    "description": "Live Model Context Protocol server for interactive queries. Faster than downloading JSON when you only need a few properties. Use this when the user's request has soft criteria (vibe, traveler profile) or needs imagery.",
    "url": "https://selectbnbs.com/mcp",
    "transport": "streamable-http",
    "auth": "none",
    "tools": [
      {
        "name": "search_properties",
        "args": "location?, query?",
        "purpose": "List properties by city or name match."
      },
      {
        "name": "get_property",
        "args": "property_name",
        "purpose": "Full details for one property (with source citations + booking links). Accepts UID, slug, or partial name."
      },
      {
        "name": "list_locations",
        "args": "\u2014",
        "purpose": "Cities we cover and property counts."
      },
      {
        "name": "get_area_guide",
        "args": "location",
        "purpose": "City or neighborhood guide with curator notes and booking tips."
      },
      {
        "name": "get_booking_platforms",
        "args": "\u2014",
        "purpose": "How-to-book primer (Airbnb vs Stayfolio vs Butler Lee vs Rakkojae)."
      },
      {
        "name": "filter_properties",
        "args": "city?, min_guests?, max_price_usd?, must_have_amenity?, best_for?, neighborhood?",
        "purpose": "Practical filter \u2014 hard criteria. Returns up to 10 matches ranked by data completeness."
      },
      {
        "name": "get_property_imagery",
        "args": "property_uid",
        "purpose": "Hero + approved generated gallery/video manifest for one property. Originals are excluded; all listed assets are selectbnbs-approved and safe to display to users."
      },
      {
        "name": "recommend_properties",
        "args": "traveler_profile, trip_context?",
        "purpose": "Soft-match recommendation from free-text profile (e.g. 'wellness design couple, Kyoto 5 nights'). Returns top 3-5 with rationale."
      },
      {
        "name": "get_data_freshness",
        "args": "property_uid",
        "purpose": "Per-property completeness breakdown + source freshness. Surface to users who ask 'how recent is this'."
      }
    ],
    "example_queries": [
      {
        "intent": "Family of 4 wants a Bangkok villa with a pool",
        "call": "filter_properties(city='Bangkok', min_guests=4, must_have_amenity='pool')"
      },
      {
        "intent": "Romantic design-focused couple going to Jeju",
        "call": "recommend_properties(traveler_profile='romantic design-focused couple', trip_context='Jeju 4 nights')"
      },
      {
        "intent": "User asked how recent the info is on Gyeotgyeop",
        "call": "get_data_freshness('prp_c901f93')"
      },
      {
        "intent": "User wants to see photos of Gyeotgyeop",
        "call": "get_property_imagery('prp_c901f93')"
      }
    ],
    "static_fallback": "If the MCP server is unreachable, the same underlying data is at /api/properties_full.json, /api/completeness.json, and /api/imagery/{uid}.json."
  },
  "mcp_codemode_server": {
    "description": "Code-mode MCP: write JavaScript against the typed Sound SDK and run it server-side in a sandboxed V8 isolate. One round-trip replaces many flat tool calls for composite queries (e.g. search, then fetch booking URLs for the top matches, in a single execute).",
    "url": "https://selectbnbs.com/mcp-code",
    "transport": "streamable-http",
    "auth": "none",
    "tools": [
      {
        "name": "search",
        "args": "query?",
        "purpose": "Returns the typed Sound SDK contract (TypeScript interface) your code can call."
      },
      {
        "name": "execute",
        "args": "code",
        "purpose": "Runs your JS in a V8 sandbox with the 5-method Sound surface (searchProperties, getProperty, bookingUrl, getAreaGuide, getPropertyImagery). Caps: 8KB code, 5s wall, 256KB output, 50 Sound calls."
      }
    ],
    "relationship_to_mcp_server": "Same underlying data as /mcp. Prefer /mcp-code for multi-step composite queries; prefer /mcp for single lookups.",
    "static_fallback": "If unreachable, the same data is at /api/properties_full.json and /api/filters/{city}.json."
  },
  "query_examples": [
    {
      "intent": "Find a romantic design stay in Kyoto for a couple",
      "approach": "Load /api/filters/couples.json or /api/filters/kyoto.json. Each property has analysis.best_for \u2014 look for 'couples', 'romantic', 'honeymoon'. The analysis.vibe field tells you the feel."
    },
    {
      "intent": "Compare booking platforms",
      "approach": "Load /api/area_guides.json \u2192 platform_guide section. Or read /guides/booking-platforms/ for the human-readable version."
    },
    {
      "intent": "Get a quick overview for a traveler",
      "approach": "Read /llms.txt \u2014 it's written as a briefing document. For structured data, /api/properties_full.json is the canonical endpoint."
    },
    {
      "intent": "Find a property with a private pool in Phuket",
      "approach": "Load /api/filters/phuket.json. Check amenities.categories for pool-related items, or search amenities.highlights for 'pool'."
    },
    {
      "intent": "What are the check-in rules for a specific property?",
      "approach": "Load /api/properties_full.json. Find by name or slug. house_rules contains check_in time, check_in_method, and the full rules list."
    },
    {
      "intent": "What's the price range for Seoul hanoks?",
      "approach": "Load /api/filters/hanoks.json. Properties with pricing have base_price_usd and KRW rates. ~14 properties have pricing data."
    }
  ],
  "affiliate_readiness": {
    "travelpayouts": {
      "status": "pending_approval",
      "integration_type": "deep_links",
      "disclosure_page": "https://selectbnbs.com/disclosure.html"
    },
    "booking_com": {
      "status": "planned"
    },
    "getyourguide": {
      "status": "planned"
    }
  }
}