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
- 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). Barebrowse cloud fetchreturns HTTP 403/500 with a "Just a moment…" interstitial. Always create the session withbrowse cloud sessions create --keep-alive --proxies --verified. - Navigate to
https://www.thecircleathermannpark.com/(the canonical hostname — note thewww.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 address3 Hermann Museum Cir Dr, Houston, TX 77004. - Navigate to
https://www.thecircleathermannpark.com/amenities.aspxand scrape the two sibling sections: Community Amenities and Apartment Amenities. Abrowse get text bodyis 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". - 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 abrowse snapshot. Each plan card emits a deterministic node group in document order:
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.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" - (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. - 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)
| Flag | Required? | Why |
|---|---|---|
--verified | yes | Cloudflare otherwise serves a JS challenge on every navigation. |
--proxies | yes | Without residential IPs the challenge escalates to a full block (HTTP 403 Akamai-style). |
--keep-alive | recommended | Same 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 tohttps://thecircleathermannpark.com/(apex, nowww) terminate at TLS withClient network socket disconnected(this is what the host pre-run antibot probe observed). Usehttps://www.thecircleathermannpark.com/everywhere.- Cloudflare bot challenge is universal across the site. Every navigation including the RentCafe
/1/*.aspxpaths is gated bycf_chl_opt. Allow ~5 s wait afterbrowse openbefore snapshot.browse cloud fetchwith or without--proxiesreturns 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.P6and.P8suffixes are floor / building-wing variants (e.g.arA10,arA10.P6,arA10.P8are 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 asnull, not0. - "Up to" prefix changes the semantic. Two-bedroom code
arB5and studio variantarB5.P8advertiseUp to 1,236andUp to 1,200sq.ft. respectively — these are upper bounds, not exact figures. Preserve theUp toprefix when surfacing the value to the user. - Studios under a 2BR base code are real.
arB5.P8is listed as Studio at "Up to 1,200 sq.ft." even though every otherarB5*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 detailsorCall for detailshave noStarting at $…line at all; reporting them as$0ornullis correct but make sure theavailabilityfield carries the human-readable status word. - Unit count appears as a free
StaticTextbetween the price block and theView Detailslink (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 internalavailableunits.aspx?floorPlans={id}&myOlePropertyId=527702URL leaks the underlying property id (527702) and plan id (e.g.2127833for 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 bodyafter page load returns both. - Phone, deposit, lease term are not surfaced on the floor plans page. Leasing phone
(855) 391-7677is 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+ populatedfloor_plansarray — happy path, what every successful run looks like.success: false+error_reasoning: "cloudflare-challenge-not-cleared"— session was launched without--verifiedand/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 apexthecircleathermannpark.com(nowww). Retry againsthttps://www.thecircleathermannpark.com/.success: truewithcurrently_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 uniformlynull.