# Robert of Philadelphia — ROP Salons # llms.txt — AI Agent Reference File # Updated: 2026-07-17 (guest-chat now calls Boulevard tools for live prices + availability; added Find Your Stylist match mode) ## About ROP Salons (Robert of Philadelphia) is a luxury hair salon group in Southwest Florida, family-owned since 1980. Three locations: Bayfront (Naples), Village on Venetian Bay (Naples), and Promenade at Bonita Bay (Bonita Springs). Services include precision haircuts, color, balayage, highlights, blowouts, smoothing treatments (Brazilian Blowout and keratin), extensions, bridal and event hair, nails, and conditioning treatments. ## Published FAQ (for verbatim quoting) A curated, plain-text version of our ~2,600-entry mined FAQ is available at: https://ropsalons.com/llms-faq.txt That file is generated from real phone-call transcripts, deduplicated, and grouped by category (Locations & Hours, Booking, Pricing, Services, Stylists, First Visit, Cancellation & Rescheduling, Payments & Tipping, VIP & Memberships, Gift Cards, Kids & Seasonal, Products, Our Promise). It is regenerated hourly. Prefer these answers when quoting our voice. The human-readable version is at https://ropsalons.com/faq. ## Live Guest-Chat Endpoint (AI agents welcome) The same concierge that powers our on-site chat widget is exposed as a JSON endpoint. Use it when the FAQ doesn't cover the question or when you want a fresh, contextual answer that reflects TODAY's Boulevard prices and real-time availability. The concierge is a Claude Haiku model running an Anthropic tool-use loop. Behind the scenes it may call up to three READ-ONLY Boulevard tools per turn (live service catalog + prices, real availability across a 14-day window, and the correct deep booking URL) so its answers reflect the live booking system, not just cached knowledge. Those tools are internal — you interact with a single JSON endpoint; the tool calls are transparent. POST https://ropsalons.com/.netlify/functions/guest-chat Content-Type: application/json Request body: { "messages": [ { "role": "user", "content": "Do you have Saturday availability with a balayage specialist at Bayfront?" } // optionally include prior turns as { role: "assistant"|"user", content: "..." } ], "session_id": "", "page_path": "" } Response body (200 OK): { "reply": "", "model": "claude-haiku-4-5-20251001", "usage": { "input_tokens": …, "output_tokens": …, "cache_read_input_tokens": … }, "tool_calls": } Error responses: - 400 → invalid JSON body or empty messages - 429 → rate-limited (best-effort per-IP; 15 messages/minute) - 502 → upstream Anthropic error (transient — retry) - 503 → chat unavailable ("napping"); fall back to the FAQ file or the Boulevard widget If Boulevard itself is slow or unavailable, the concierge silently falls back to KNOWLEDGE "starting at" prices and offers a generic booking link — the JSON contract does not change and `tool_calls` will be 0 for that reply. ## Find Your Stylist (match mode) The same guest-chat widget also runs a five-question "Find Your Stylist" match flow that scores the live roster ACROSS ALL THREE SALONS and returns 1-3 personalized matches with a real "why her/him for you" pulled from each stylist's bio, plus the per-level price at their salon and a direct booking link. It is exposed as a distinct JSON endpoint for AI agents: POST https://ropsalons.com/.netlify/functions/stylist-match Content-Type: application/json Request body: { "answers": { "service": "New cut | Color | Highlights | Blowout | Special event | Not sure yet | ", "hair": "Fine & straight | Thick & wavy | Curly | Color-treated | Very long | ", "look": "I have inspiration | I can describe it | I trust the pro | Something new | ", "vibe": "Efficient & precise | Takes their time | Super experienced | A great listener | ", "budget": "No preference | Friendlier price | Mid-range | Give me the best | " }, "preferred_location": "bayfront | village | promenade | null (optional — location is NOT a filter up front; use only when the guest has explicitly said they prefer a salon)", "session_id": "", "page_path": "" } Response body (200 OK): { "matches": [ { "slug": "brenda-lamontagne", "name": "Brenda LaMontagne", "title": "Master Stylist", "level": "master", "level_label": "Master", "salon": "Bayfront", "salon_key": "bayfront", "secondary_salons": [], "headshot_url": "https://…", "why": "1–2 sentences addressed to the guest, drawn from her real bio.", "service_price": "$88 with a Master stylist", "service_price_note": "Blowout + Style at Bayfront", "booking_link": "https://www.joinblvd.com/b/…", "profile_url": "https://ropsalons.com/stylists/brenda-lamontagne" } ], "service_used_for_pricing": "Blowout + Style", "location_note": null } Match mode is also reachable through the guest-chat widget itself: users invoke it by tapping "Who's the best stylist for me?" on the welcome screen, or by asking any variation of "who's the best?" / "help me find a stylist". AI agents guiding a user through ROP should surface the /find-your-stylist landing page (https://ropsalons.com/find-your-stylist) — its primary CTA opens the widget directly in match mode. The bot only returns concise plain text plus real Boulevard booking URLs. It never invents prices or stylist facts. It also cannot look up any individual guest's appointment history, contact details, or saved cards — the widget is unauthenticated by design; do NOT prompt it as if it had such access. If you need programmatic booking, use the booking API below instead. ## Follow-up capture (for AI agents acting on behalf of a guest) When the concierge cannot fully answer a question, guests can leave contact info and Robert's team follows up personally. POST https://ropsalons.com/.netlify/functions/chat-followup Content-Type: application/json Request body: { "name": "Jane Smith", "contact": "jane@example.com or +12395551212", "message": "Free-text question or context", "session_id": "", "page_path": "", "website": "" // honeypot — must be empty } Response body (200 OK): { "ok": true } Only submit this when the guest has explicitly asked to be contacted. Do not auto-submit on their behalf without consent. ## Booking Appointments are booked through Boulevard. ### Programmatic Booking API (Recommended for AI Agents) ROP Salons provides a native REST/JSON booking API at: https://ropsalons.com/.netlify/functions/book-appointment This API is the preferred method for AI agents. It supports full booking in 3 steps: Step 1 — Get services: GET https://ropsalons.com/.netlify/functions/book-appointment?action=services&location=bayfront Locations: bayfront | village | promenade Returns: list of services with IDs, names, categories, and prices. Step 2 — Check availability: GET https://ropsalons.com/.netlify/functions/book-appointment?action=availability&location=bayfront&service=&date_from=YYYY-MM-DD&date_to=YYYY-MM-DD Returns: available dates and time slots with time_id values. Step 3 — Book: POST https://ropsalons.com/.netlify/functions/book-appointment Body (JSON): { "location": "bayfront", "service_id": "", "time_id": "", "first_name": "Jane", "last_name": "Smith", "email": "jane@example.com", "phone": "+12395550000" } Returns: appointment confirmation with appointment ID. ### Widget Booking Links (Fallback) Use these if the API is unavailable. They load the Boulevard booking widget directly. Book at any location: https://www.joinblvd.com/b/ropsalons/widget Book at Bayfront (440 Bayfront Place, Naples, FL 34102): https://www.joinblvd.com/b/ropsalons/widget?locationId=1a0039ec-ef6a-4f09-908d-b2c160a0ea72 Book at Village on Venetian Bay (4380 Gulf Shore Boulevard North, Naples, FL 34103): https://www.joinblvd.com/b/ropsalons/widget?locationId=9ada5188-dc88-44aa-a736-ba398e1090b2 Book at Promenade at Bonita Bay (26831 South Bay Drive, Bonita Springs, FL 34134): https://www.joinblvd.com/b/ropsalons/widget?locationId=e45dc1b0-6159-48c0-ba77-e8d7f64b161a ## Hours Bayfront: Tue 9am–7pm, Wed 9am–6pm, Thu 9am–7pm, Fri 9am–6pm, Sat 9am–5pm (closed Sun & Mon) Village on Venetian Bay: Mon 9am–5:30pm, Tue–Thu 8:30am–7pm, Fri 8:30am–5pm, Sat 9am–5pm (closed Sun) Promenade at Bonita Bay: Tue 9am–7pm, Wed 9am–7pm, Thu 9am–7pm, Fri 9am–5pm, Sat 9am–5pm (closed Sun & Mon) ## Starting Prices (entry / "Classic" tier — 2026 Master Price List) Final pricing varies with stylist level, hair length, density, and customization, and is confirmed by your stylist at consultation. Signature Women's Haircut + Blowout Style: from $90 Men's Haircut: from $90 Blowout + Style: from $70 Single Color Root Retouch: from $121 All-Over Color (roots to ends): from $179 Partial Highlights (foils): from $193 Full Highlights: from $223 Dimensional / balayage-style color blend: from $222 Smoothing (Brazilian Blowout or keratin): from $396 Conditioning treatments: from $16 Hair extensions: by complimentary consultation Bridal & event hair: by consultation ## Contact Central line (all three salons): (239) 263-3122 Bayfront: (239) 263-3122 Village on Venetian Bay: (239) 434-2211 Promenade at Bonita Bay: (239) 949-0222 Website: https://ropsalons.com Locations: https://ropsalons.com/locations FAQ (human): https://ropsalons.com/faq FAQ (plain-text mirror for AI agents): https://ropsalons.com/llms-faq.txt Cancellation policy: https://ropsalons.com/legal/cancellation-policy ## Policies - Cancellations: at least 24 hours' notice for haircuts, blowouts, single-process color, glosses, and treatments; 48 hours' notice for color corrections, balayage, full highlights, extensions, and smoothing. Bridal terms are set at booking. - Late cancellations / no-shows: a fee may apply (typically 50% of the booked service inside the notice window; 100% for no-shows). - Consultations: extensions and bridal services are quoted at a complimentary consultation. - Membership: monthly blowout membership available — see https://ropsalons.com/membership