thecircleathermannpark.com logo
thecircleathermannpark.com

property-overview-with-amenities-and-flo

Installation

Adds this website's skill for your agents

 

Summary

Extract The Circle at Hermann Park (Houston, TX) property snapshot — building amenities, apartment amenities, neighborhood/Museum District amenities, and every floor plan with bedrooms, bathrooms, square footage, starting price, and current unit availability.

FIG. 01
FIG. 02
FIG. 03
FIG. 04
SKILL.md
241 lines

Property Overview, Amenities & Floor Plans — The Circle at Hermann Park

Purpose

Extract a complete read-only property overview for The Circle at Hermann Park (3 Hermann Museum Cir Dr, Houston, TX 77004): the building/community amenities, the in-apartment amenities, the surrounding neighborhood amenities, and every floor plan listed on the site — including each plan's code, bedrooms, bathrooms, square footage, starting price, available-unit count, and availability status (Available Now / Inquire / Call / Waitlist). The site is a RentCafe-powered property page sitting behind Cloudflare's bot-challenge, so this skill is browser-driven with stealth turned on.

When to Use

  • A user asks for a high-level "tell me about this apartment building" digest of The Circle at Hermann Park.
  • A user wants the current published rent / square footage / unit count for any specific floor plan at the property.
  • A user wants to compare community amenities (pools, gym, garage, concierge, etc.) against in-unit amenities (granite, washer/dryer, walk-in closets, etc.).
  • A user is researching the Hermann Park / Museum District neighborhood (Houston, TX 77004) as a relocation target and wants the bordering landmarks, schools, dining, and transit options the property advertises.

Workflow

  1. Spin up a Browserbase session with stealth ON. The homepage and every RentCafe-rendered subpath sit behind Cloudflare's interactive challenge (cf_chl_opt, Cf-Mitigated: challenge). Bare browse cloud fetch returns HTTP 403/500 with a "Just a moment…" interstitial. Always create the session with browse cloud sessions create --keep-alive --proxies --verified.
  2. Navigate to https://www.thecircleathermannpark.com/ (the canonical hostname — note the www. is mandatory; the apex returns connect-time TLS errors). Wait ~5 s for Cloudflare to clear. The homepage carries the property name, the leasing phone (855) 391-7677, and the address 3 Hermann Museum Cir Dr, Houston, TX 77004.
  3. Navigate to https://www.thecircleathermannpark.com/amenities.aspx and scrape the two sibling sections: Community Amenities and Apartment Amenities. A browse get text body is the cleanest grab — both lists are flat <li> rollups, no JS-gated expansion needed once the page is past the challenge. The * suffix in any amenity name means "select units only".
  4. Navigate to https://www.thecircleathermannpark.com/1/floorplans.aspx (the RentCafe-powered floor plans grid; note the /1/ path prefix). Wait ~3 s and take a browse snapshot. Each plan card emits a deterministic node group in document order:
    div
      StaticText "<beds> Bed - <baths> Bath"  | "Studio"
      StaticText "|"
      StaticText "<sqft>"                       (may be empty, or prefixed with "Up to ")
      StaticText "sq.ft."
    heading: <plan_code>                        ← e.g. arA10, arA10.P6, arB5.P8, arS2.P6
    link:    <plan_code> floorplan overview
    image
    <price block>:
        StaticText "Starting at"
        StaticText "$1,425.00"
        superscript "/"
      StaticText "<N> Available Now"
      link    "View Details"
    OR (no current availability):
      StaticText "Inquire for details" | "Call for details" | "Waitlist"
      button   "Contact"
    
    Bind the spec-block (Bed/Bath/sqft) to the heading that follows it, NOT the one that precedes it — this is the single most common parsing bug for this page. See gotchas.
  5. (Optional) Confirm unit-level availability at https://www.thecircleathermannpark.com/1/availableunits.aspx — this lists individual unit numbers with their own per-unit price, term, and move-in date. Useful when the floor plan card shows "N Available Now" but the user wants to see the actual unit grid.
  6. Read-only — do not click "View Details" / "Contact" / "Schedule a Tour" / "Apply Now". Those routes are leasing-funnel CTAs and they spin up an applicant-account flow. Stop at the plan card.

Browser session config (mandatory)

FlagRequired?Why
--verifiedyesCloudflare otherwise serves a JS challenge on every navigation.
--proxiesyesWithout residential IPs the challenge escalates to a full block (HTTP 403 Akamai-style).
--keep-aliverecommendedSame session reused across /, /amenities.aspx, /1/floorplans.aspx, /1/availableunits.aspx avoids re-solving the challenge on each nav.

Site-Specific Gotchas

  • www. is mandatory. Direct connections to https://thecircleathermannpark.com/ (apex, no www) terminate at TLS with Client network socket disconnected (this is what the host pre-run antibot probe observed). Use https://www.thecircleathermannpark.com/ everywhere.
  • Cloudflare bot challenge is universal across the site. Every navigation including the RentCafe /1/*.aspx paths is gated by cf_chl_opt. Allow ~5 s wait after browse open before snapshot. browse cloud fetch with or without --proxies returns the "Just a moment…" interstitial HTML, not the real page.
  • Plan code naming convention. arA* = one-bedroom, arB* = two-bedroom, arC* = three-bedroom, arS* = studio. The .P6 and .P8 suffixes are floor / building-wing variants (e.g. arA10, arA10.P6, arA10.P8 are three views of the same base layout). A single base code can appear with all three variants and each variant has its own availability, so do not dedupe by base code.
  • Spec block (Bed/Bath/sqft) is rendered BEFORE its plan's heading in document order, not after. Easy to misattribute to the previous card. The correct rule: the spec block immediately preceding heading: <plan_code> belongs to that plan code. Confirmed against the rendered DOM in iter 1 — autobrowse's first-pass extraction got this wrong on the cards it summarized aloud.
  • Empty sqft fields are real, not parser failures. Several variants (e.g. arA10, arA13.P8, arB6.P8, arC4.P8) intentionally publish no square footage; the page shows | sq.ft. with no number between the pipe and the unit. Encode as null, not 0.
  • "Up to" prefix changes the semantic. Two-bedroom code arB5 and studio variant arB5.P8 advertise Up to 1,236 and Up to 1,200 sq.ft. respectively — these are upper bounds, not exact figures. Preserve the Up to prefix when surfacing the value to the user.
  • Studios under a 2BR base code are real. arB5.P8 is listed as Studio at "Up to 1,200 sq.ft." even though every other arB5* variant is 2BR. Don't infer beds from the base letter — always read the rendered spec.
  • Pricing is shown ONLY for plans that have inventory. Plans with Inquire for details or Call for details have no Starting at $… line at all; reporting them as $0 or null is correct but make sure the availability field carries the human-readable status word.
  • Unit count appears as a free StaticText between the price block and the View Details link (e.g. 10 Available Now). It is not inside the price div. Parsers that read only the price div will miss it.
  • No native API. The site is plain ASP.NET (.aspx) + RentCafe; there is no public JSON endpoint exposing plans/availability. Don't waste a turn looking for one. The RentCafe internal availableunits.aspx?floorPlans={id}&myOlePropertyId=527702 URL leaks the underlying property id (527702) and plan id (e.g. 2127833 for one of the studios) but those routes are equally Cloudflare-gated and still return HTML, not JSON.
  • Don't pre-emptively click "Apartment Amenities" or "Community Amenities" filter tabs on the amenities page. Both lists are already in the DOM; clicking the filter only re-orders them. A single browse get text body after page load returns both.
  • Phone, deposit, lease term are not surfaced on the floor plans page. Leasing phone (855) 391-7677 is in the page header banner across the site. Deposit and lease term only appear behind the "Apply Now" funnel — out of scope for read-only extraction.

Expected Output

Return a single JSON object. Empty / unknown values are explicit nulls, never omitted keys.

{
  "success": true,
  "property_name": "The Circle at Hermann Park",
  "address": "3 Hermann Museum Cir Dr, Houston, TX 77004",
  "leasing_phone": "(855) 391-7677",
  "community_amenities": [
    "Two 24-Hr State-Of-The-Art Fitness Studios",
    "Two Resort Style Pools",
    "Apple Airplay-Compatible Game Room With Shuffleboard, Nostalgia Arcade, And Foosball",
    "Clubhouse",
    "Complimentary Wi-Fi Access In Common Areas*",
    "Convenient Access To Major Highways",
    "Convenient Multi-Level Parking Garage",
    "Courtyard with Fire Pit",
    "Designer Color Schemes",
    "Elevator Services",
    "Electric Car Charging Station",
    "Executive Conference Center",
    "Fully Equipped Business Center With Wi-Fi",
    "Gas Grilling Stations by Pit Masters of Texas",
    "High-Speed Internet Available",
    "Indoor Mail Facility",
    "Major Regional Employers In Immediate Area",
    "Medical Center Shuttle",
    "New Spin Room for Cycle Enthusiasts",
    "Night Patrol",
    "Official Uber Pick Up/Drop-off Location",
    "Open 42-Inch Entertainment Bar",
    "Pet Playland Park",
    "Picnic Areas With Zen Garden Landscaping",
    "Planned Resident Social Activities",
    "Remote Controlled Limited Entry Gates",
    "Resident Cyber Cafe With Starbucks Coffee",
    "Short Term Lease Options",
    "Valet Dry Cleaning",
    "Welcome Center With Professional On-Site Management",
    "Yoga/Pilates Room With Scheduled Monthly Classes"
  ],
  "apartment_amenities": [
    "Brushed Chrome Hardware",
    "Spacious, Open Kitchen With Abundant Cabinet Space And Island*",
    "Breakfast Bar With Pendant Lighting*",
    "Built-In Bookshelves*",
    "Ceiling Fan",
    "Deep Soaking Roman Bathtubs",
    "Dramatic Ceramic Tile Entries, Baths And Kitchens (Including Backsplash)*",
    "Dual Master Bath Sinks With Vanity*",
    "Exposed Brick Walls*",
    "Glass Enclosed Standup Shower*",
    "Granite Countertops*",
    "Individual Climate Control",
    "Lofty Nine Foot Ceilings With Stunning Crown Molding*",
    "On Site Storage*",
    "Oversized Walk-In Closets",
    "Patio With Storage Closet*",
    "Personal Laundry Room With Full-Size Washer And Dryer Included*",
    "Pre-Wired For Cable In Living Room And Bedrooms",
    "Spacious Floor Plans With Large Rooms",
    "Stainless Steel And Black Appliances*",
    "Wheelchair Accessible",
    "Wood Flooring*"
  ],
  "neighborhood_amenities": [
    "Hermann Park (adjacent / bordering the property)",
    "Museum District — 19 world-renowned museums within walking distance",
    "Houston Zoo (~7 minutes away)",
    "Miller Outdoor Theatre",
    "Rice University (nearby)",
    "University of Houston (nearby)",
    "Texas Southern University (nearby)",
    "Texas Medical Center — served by on-site Medical Center Shuttle",
    "Central Business District (bordering)",
    "Lucille's Restaurant",
    "Barnaby's Café",
    "Axelrad Beer Garden",
    "Hermann Park Lake Plaza shopping",
    "Upscale restaurants on Almeda Road",
    "Hermann Golf Park",
    "Official Uber Pick-Up / Drop-Off Location on-site",
    "Convenient access to major Houston highways"
  ],
  "floor_plans": [
    { "code": "arA10",    "bedrooms": 1, "bathrooms": 1,   "sqft": null, "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arA10.P6", "bedrooms": 1, "bathrooms": 1,   "sqft": 764,  "sqft_prefix": null,  "starting_price_usd": null, "availability": "Call",          "units_available": null },
    { "code": "arA10.P8", "bedrooms": 1, "bathrooms": 1,   "sqft": 764,  "sqft_prefix": null,  "starting_price_usd": 1425, "availability": "Available Now", "units_available": 1 },
    { "code": "arA11",    "bedrooms": 1, "bathrooms": 1,   "sqft": 786,  "sqft_prefix": null,  "starting_price_usd": 1654, "availability": "Available Now", "units_available": 2 },
    { "code": "ArA11.P6", "bedrooms": 1, "bathrooms": 1,   "sqft": 786,  "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arA11.P8", "bedrooms": 1, "bathrooms": 1,   "sqft": 786,  "sqft_prefix": null,  "starting_price_usd": 1425, "availability": "Available Now", "units_available": 1 },
    { "code": "arA12",    "bedrooms": 1, "bathrooms": 1,   "sqft": 816,  "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arA12.P6", "bedrooms": 1, "bathrooms": 1,   "sqft": 816,  "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arA12.P8", "bedrooms": 1, "bathrooms": 1,   "sqft": 816,  "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arA13",    "bedrooms": 1, "bathrooms": 1,   "sqft": 907,  "sqft_prefix": null,  "starting_price_usd": 1804, "availability": "Available Now", "units_available": 1 },
    { "code": "arA13.P6", "bedrooms": 1, "bathrooms": 1,   "sqft": 907,  "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arA13.P8", "bedrooms": 1, "bathrooms": 1,   "sqft": null, "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arA14",    "bedrooms": 1, "bathrooms": 1,   "sqft": 963,  "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arA14.P8", "bedrooms": 1, "bathrooms": 1,   "sqft": 963,  "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arB5",     "bedrooms": 2, "bathrooms": 2,   "sqft": 1236, "sqft_prefix": "Up to", "starting_price_usd": 2132, "availability": "Available Now", "units_available": 2 },
    { "code": "arB5.P6",  "bedrooms": 2, "bathrooms": 2,   "sqft": 1159, "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arB5.P8",  "bedrooms": 0, "bathrooms": 1,   "sqft": 1200, "sqft_prefix": "Up to", "starting_price_usd": 1549, "availability": "Available Now", "units_available": 10 },
    { "code": "arB6",     "bedrooms": 2, "bathrooms": 2,   "sqft": 1562, "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arB6.P8",  "bedrooms": 2, "bathrooms": 2.5, "sqft": null, "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arB7",     "bedrooms": 2, "bathrooms": 2,   "sqft": 1404, "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arB7.P6",  "bedrooms": 2, "bathrooms": 2,   "sqft": null, "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arB7.P8",  "bedrooms": 2, "bathrooms": 2,   "sqft": 1376, "sqft_prefix": null,  "starting_price_usd": 1870, "availability": "Available Now", "units_available": 1 },
    { "code": "arC3",     "bedrooms": 3, "bathrooms": 2,   "sqft": 1478, "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arC3.P6",  "bedrooms": 3, "bathrooms": 2,   "sqft": 1478, "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arC3.P8",  "bedrooms": 3, "bathrooms": 2,   "sqft": 1478, "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arC4",     "bedrooms": 3, "bathrooms": 2,   "sqft": 1547, "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arC4.P8",  "bedrooms": 3, "bathrooms": 2,   "sqft": null, "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arS2",     "bedrooms": 0, "bathrooms": 1,   "sqft": 643,  "sqft_prefix": null,  "starting_price_usd": 1280, "availability": "Available Now", "units_available": 1 },
    { "code": "arS2.P6",  "bedrooms": 0, "bathrooms": 1,   "sqft": 643,  "sqft_prefix": null,  "starting_price_usd": null, "availability": "Inquire",       "units_available": null },
    { "code": "arS3.P8",  "bedrooms": 0, "bathrooms": 1,   "sqft": 643,  "sqft_prefix": null,  "starting_price_usd": 1674, "availability": "Available Now", "units_available": 2 }
  ],
  "summary": {
    "total_floor_plans": 30,
    "currently_available_plans": 9,
    "currently_available_units": 22,
    "studios_available_from_usd": 1280,
    "one_bedroom_available_from_usd": 1425,
    "two_bedroom_available_from_usd": 1870,
    "three_bedroom_available_from_usd": null,
    "max_starting_price_usd": 2132
  },
  "error_reasoning": null
}

Outcome shapes

  • success: true + populated floor_plans array — happy path, what every successful run looks like.
  • success: false + error_reasoning: "cloudflare-challenge-not-cleared" — session was launched without --verified and/or --proxies, page returned the "Just a moment…" interstitial. Re-run with both stealth flags.
  • success: false + error_reasoning: "tls-handshake-failed" — caller used the apex thecircleathermannpark.com (no www). Retry against https://www.thecircleathermannpark.com/.
  • success: true with currently_available_plans: 0 — leasing inventory genuinely empty (every plan card shows "Inquire" / "Call" / "Waitlist"). The amenity arrays and plan metadata are still populated; only the pricing/units fields are uniformly null.