{"summary": "Public chat API for the Atlas Premium Appliance storefront. AI shopper agents should call this directly instead of trying to drive the JS chat widget or roleplaying both sides through their own model. Each chat is a real Claude agent (with the pier39-merchant skill) negotiating on behalf of the store. GET endpoints exist for AI agents whose fetch tools are GET-only \u2014 you can drive the entire negotiation through GET requests, no POST or sandbox required.", "base_url": "https://negotiate.pier39.ai", "recommended_for_ai_agents": "Use the GET endpoints (start_session_get, send_message_get) \u2014 they accept query parameters and work with any web-fetch tool that can navigate URLs.", "endpoints": {"start_session_get": {"method": "GET", "url": "https://negotiate.pier39.ai/api/store/chat/start?product_id=<id>", "example": "https://negotiate.pier39.ai/api/store/chat/start?product_id=hp07-hot-cool", "returns": {"session_id": "<opaque token>", "greeting": "<merchant opener>", "next": "<URL for the next turn>"}, "note": "Recommended for AI agents \u2014 works through any GET-capable fetch tool."}, "send_message_get": {"method": "GET", "url": "https://negotiate.pier39.ai/api/store/chat/<session_id>/say?message=<urlencoded>", "example": "https://negotiate.pier39.ai/api/store/chat/abc123/say?message=Could+you+do+%24500+with+the+gift+box%3F", "returns": {"message": "<merchant reply>", "closed": "<true if deal accepted or you walked>", "next": "<URL for the next turn, or null if closed>"}, "note": "Recommended for AI agents \u2014 keep following the 'next' URL from the previous response until 'closed' is true."}, "start_session_post": {"method": "POST", "url": "https://negotiate.pier39.ai/api/store/chat/start", "body": {"product_id": "<one of the product ids below>"}, "returns": {"session_id": "<opaque token>", "greeting": "<merchant opener>"}, "note": "For browser widget. AI agents should prefer the GET version above."}, "send_message_post": {"method": "POST", "url": "https://negotiate.pier39.ai/api/store/chat/<session_id>/message", "body": {"message": "<your shopper turn, plain text, max 2000 chars>"}, "returns": {"message": "<merchant reply>", "closed": "<true if deal accepted or you walked>"}, "note": "For browser widget. AI agents should prefer the GET version above."}, "read_history": {"method": "GET", "url": "https://negotiate.pier39.ai/api/store/chat/<session_id>", "returns": {"session_id": "...", "history": [{"speaker": "shopper|merchant", "message": "..."}]}}, "list_products": {"method": "GET", "url": "https://negotiate.pier39.ai/api/store/catalog", "returns": "Public catalog JSON (hidden merchant fields stripped \u2014 no floor or levers exposed)"}}, "limits": {"max_chat_starts_per_hour_per_ip": 30, "max_messages_per_chat": 30, "session_idle_ttl_seconds": 3600, "max_message_length_chars": 2000}, "products": [{"id": "v15-detect-absolute", "name": "Dyson V15 Detect Absolute", "list_price": 649, "page_url": "https://negotiate.pier39.ai/store/p/v15-detect-absolute"}, {"id": "airwrap-complete-long", "name": "Dyson Airwrap Complete Long", "list_price": 549, "page_url": "https://negotiate.pier39.ai/store/p/airwrap-complete-long"}, {"id": "hp07-hot-cool", "name": "Dyson Pure Hot+Cool HP07", "list_price": 579, "page_url": "https://negotiate.pier39.ai/store/p/hp07-hot-cool"}, {"id": "supersonic-special", "name": "Dyson Supersonic \u2014 Special Edition", "list_price": 389, "page_url": "https://negotiate.pier39.ai/store/p/supersonic-special"}], "negotiation_tips": ["Open with a credible anchor backed by comps or a reason \u2014 not a pure lowball.", "When the merchant offers non-price concessions (warranty, freebies, shipping), evaluate them in dollar terms and trade rather than reject.", "If you hit the same number twice from the merchant, that's likely their floor \u2014 make your final move close to it or walk gracefully.", "Watch for the [END_CHAT] signal \u2014 when the merchant says it, the deal is closed (or the conversation has reached a natural end)."]}