{"service":"Partition Pros Agent API","version":"1.0.0","description":"Live pricing, catalog, takeoff resolution, and quoting for commercial toilet partitions, Division 10 restroom accessories, and lockers. Built for estimators working through an AI assistant.","docs":{"openapi":"https://www.thepartitionpros.com/.well-known/openapi.json","mcp":"https://www.thepartitionpros.com/mcp","catalog_text":"https://www.thepartitionpros.com/llms-products.txt","overview":"https://www.thepartitionpros.com/llms.txt"},"calling":{"rest":"GET or POST https://www.thepartitionpros.com/agent/v1/{tool}. Read-only tools accept query-string arguments on GET; all tools accept a JSON body on POST.","mcp":"Streamable HTTP MCP server at https://www.thepartitionpros.com/mcp (JSON-RPC 2.0).","auth":"None required for catalog, list pricing, lead times, freight, and estimates. Contract pricing and order status require an API key — email info@thepartitionpros.com.","rate_limit":"120 requests per minute per IP. See X-RateLimit-Remaining."},"pricing_notes":{"currency":"USD","list_pricing":"Catalog prices are published list prices, the same numbers shown on the website.","estimates":"price_partition_build and estimate_freight return storefront estimates derived from Partition Pros quote history; each response carries pricing_authority and valid_until.","binding":"create_quote returns a hub-priced proposal. That is the authoritative number."},"contact":{"phone":"(646) 453-4564","email":"info@thepartitionpros.com","web":"https://www.thepartitionpros.com"},"tools":[{"name":"search_products","title":"Search the product catalog","description":"Search 1,100+ commercial restroom products (ASI, Bobrick, Bradley, Hadrian, Zurn, World Dryer) by keyword, brand, or price. Returns list price, lead time, quick-ship status, and — for configurable products — every finish/color/size axis with its option values. Use this when you know what KIND of product you need. If you already have a part number, use get_product; if you have a whole list of part numbers, use resolve_takeoff instead of calling this repeatedly.","read_only":true,"endpoint":"https://www.thepartitionpros.com/agent/v1/search_products","methods":["GET","POST"],"input_schema":{"type":"object","additionalProperties":false,"properties":{"query":{"type":"string","description":"Free text, e.g. \"matte black grab bar 36\" or \"recessed towel dispenser\".","maxLength":200},"brand":{"type":"string","description":"Exact manufacturer name to filter by: ASI, Bobrick, Bradley, Hadrian, Zurn, World Dryer.","maxLength":60},"category_id":{"type":"integer","description":"BigCommerce category id, when narrowing a previous result."},"min_price":{"type":"number","minimum":0},"max_price":{"type":"number","minimum":0},"limit":{"type":"integer","description":"Products to return (1–50).","minimum":1,"maximum":50,"default":20},"cursor":{"type":"string","description":"next_cursor from a previous response, to page forward."}}}},{"name":"get_product","title":"Get one product in full","description":"Full detail for a single product by SKU, manufacturer part number, or numeric id — description, specifications, downloadable spec sheets and install manuals, and every priced variant with its option values. Tolerant of how part numbers get typed: \"B-262\", \"b262\", and a model number lifted from a product title all resolve. On a miss it returns ranked alternates rather than an empty result.","read_only":true,"endpoint":"https://www.thepartitionpros.com/agent/v1/get_product","methods":["GET","POST"],"input_schema":{"type":"object","additionalProperties":false,"required":["identifier"],"properties":{"identifier":{"type":"string","description":"SKU, MPN, model number, or BigCommerce product id.","minLength":1,"maxLength":100,"examples":["B-262","10-STRAIGHT-GB-SERIES","2B1-000000-SERIES"]}}}},{"name":"resolve_takeoff","title":"Price a whole takeoff list","description":"THE tool for estimators. Paste a raw takeoff — part numbers with quantities, however they were copied out of a spec section or spreadsheet — and get back priced line items with a subtotal. Handles \"B-262\", \"B-262, 4\", \"4x B-262\", \"(4) B-262\". Every line that does NOT match comes back with ranked alternates and the reason it failed, so you can resolve it in one more call instead of giving up. Prefer this over looping get_product: it is one round-trip for up to 250 lines.","read_only":true,"endpoint":"https://www.thepartitionpros.com/agent/v1/resolve_takeoff","methods":["GET","POST"],"input_schema":{"type":"object","additionalProperties":false,"properties":{"text":{"type":"string","description":"The raw list, one item per line. Either this or `items` is required.","maxLength":20000},"items":{"type":"array","description":"Structured alternative to `text`.","maxItems":250,"items":{"type":"object","additionalProperties":false,"required":["sku"],"properties":{"sku":{"type":"string","minLength":1,"maxLength":100},"quantity":{"type":"integer","minimum":1,"maximum":9999,"default":1}}}}}}},{"name":"price_partition_build","title":"Estimate a toilet-partition build","description":"Itemized ESTIMATE for a commercial toilet-partition build: material, stall count, room layout, urinal screens, destination state, plus hardware/hinge/height/privacy upcharges. Returns per-line rates and quantities, freight, and a total, priced from the Partition Pros configurator price book — the same layout-aware engine behind design-your-partition quotes (layout changes the price: between-walls is the cheapest first stall, free-standing the priciest). This is an estimate — `pricing_authority` says so and `valid_until` says how long it holds. When the customer is ready to commit, call create_quote for the binding, hub-priced proposal. Call list_options first if you are unsure of an id.","read_only":true,"endpoint":"https://www.thepartitionpros.com/agent/v1/price_partition_build","methods":["GET","POST"],"input_schema":{"type":"object","additionalProperties":false,"required":["material","stalls","state"],"properties":{"material":{"type":"string","enum":["powder-coated","plastic-laminate","solid-plastic","phenolic","stainless-steel"],"description":"Partition material id."},"stalls":{"type":"integer","description":"Total toilet compartments across the build.","minimum":1,"maximum":500},"urinal_screens":{"type":"integer","minimum":0,"maximum":500,"default":0},"state":{"type":"string","description":"Two-letter US state code for freight, e.g. \"TX\".","minLength":2,"maxLength":2},"layout":{"type":"string","enum":["corner-wall","between-walls","free-standing","alcove","alcove-between-walls"],"description":"Room layout: which walls the stall run touches (it always backs onto a wall). corner-wall = one end of the run butts a side wall; the other end stops short of the wall and is closed with an end panel. between-walls = ONLY when the stalls use the entire length of the wall, wall to wall: the last stall closes against the far side wall, no end panel (stall widths add up to the wall-to-wall dimension). If the row ends short of the far wall (open floor, urinals, sinks or a gap after the last stall), it needs an end panel and is corner-wall, not between-walls, even though a wall exists further along. free-standing = neither end touches a side wall: end panels on both ends. alcove = the stall at the wall end sits in a recess: side wall, back wall AND a wall (or panel) across its front, so its door is on the SIDE of that stall, facing along the row (perpendicular to the other doors); the far end of the run is open with an end panel. Usually the ADA stall. alcove-between-walls = alcove at one end AND the stalls use the entire wall length so the far end closes against a side wall; if the row stops short and needs an end panel, it is alcove. Reading a sketch: toilets are circles/ovals (often with a tank), lines between them are partition panels, a short diagonal or arc at a stall front is a door swing, hatched or shaded rectangles are walls (wet walls, partial walls), not partitions, and a urinal screen is a single short line sticking out from the wall beside a urinal (urinals are small ovals or U shapes on the wall) — count screens in urinal_screens, not stalls. A door drawn on the side of the end stall, or a wall line running from the row front to the room wall in front of that stall, means alcove. Use one room entry per restroom. Changes the price (panel count differs). Defaults to corner-wall."},"hardware":{"type":"string","enum":["chrome","stainless"],"description":"Defaults to chrome."},"height":{"type":"string","enum":["standard","full"],"description":"\"full\" adds +30% (not available in solid-plastic or plastic-laminate)."},"hinge":{"type":"string","enum":["gravity","piano"],"description":"Defaults to gravity."},"privacy":{"type":"array","description":"Privacy add-ons; each is a per-stall upcharge.","items":{"type":"string","enum":["occupancy-indicator","hinge-fillers","continuous-brackets"]},"maxItems":3},"color":{"type":"string","description":"Color id for the chosen material (see list_options).","maxLength":80}}}},{"name":"estimate_freight","title":"Estimate LTL freight","description":"Freight-only estimate for a partition shipment to a US state. Useful when the customer already has product pricing and only needs delivered cost. Solid plastic (HDPE) carries a heavier-material surcharge, already included in the returned total.","read_only":true,"endpoint":"https://www.thepartitionpros.com/agent/v1/estimate_freight","methods":["GET","POST"],"input_schema":{"type":"object","additionalProperties":false,"required":["state","material","stalls"],"properties":{"state":{"type":"string","minLength":2,"maxLength":2},"material":{"type":"string","enum":["powder-coated","plastic-laminate","solid-plastic","phenolic","stainless-steel"]},"stalls":{"type":"integer","minimum":1,"maximum":500},"urinal_screens":{"type":"integer","minimum":0,"maximum":500,"default":0}}}},{"name":"resolve_accessories","title":"Build a restroom accessory schedule","description":"Turn a restroom's fixture counts into a Division 10 accessory schedule with real SKUs, quantities, and prices — dispensers, grab bars, mirrors, hooks, waste receptacles, baby changing. Every line names the rule that produced it, including the ADA 2010 section for grab bars. These are Partition Pros default conventions, NOT a code-compliance determination: surface the returned `disclaimer` to the user and let local code and the project spec govern.","read_only":true,"endpoint":"https://www.thepartitionpros.com/agent/v1/resolve_accessories","methods":["GET","POST"],"input_schema":{"type":"object","additionalProperties":false,"required":["rooms"],"properties":{"rooms":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","additionalProperties":false,"required":["room_type"],"properties":{"name":{"type":"string","maxLength":80,"description":"e.g. \"Level 2 Men's\"."},"room_type":{"type":"string","enum":["mens","womens","unisex","family"]},"water_closets":{"type":"integer","minimum":0,"maximum":200,"default":0},"ada_water_closets":{"type":"integer","description":"Accessible compartments, counted WITHIN water_closets.","minimum":0,"maximum":200,"default":0},"urinals":{"type":"integer","minimum":0,"maximum":200,"default":0},"lavatories":{"type":"integer","minimum":0,"maximum":200,"default":0},"baby_changing":{"type":"boolean","default":false}}}},"brand":{"type":"string","description":"Bias SKU selection toward one manufacturer, e.g. \"Bobrick\".","maxLength":60},"exclude":{"type":"array","description":"Rule ids to omit from the schedule.","items":{"type":"string","maxLength":60},"maxItems":20}}}},{"name":"list_options","title":"List every partition option id","description":"The enumerated, stable ids that price_partition_build and create_quote accept: materials, mountings, layouts, hardware, heights, privacy add-ons, hinges, shipping adds, per-material colors with their lead times and quick-ship flags, and the current upcharge rates. Call this before quoting if you are unsure of an id — guessing produces an invalid_input error.","read_only":true,"endpoint":"https://www.thepartitionpros.com/agent/v1/list_options","methods":["GET","POST"],"input_schema":{"type":"object","additionalProperties":false,"properties":{"material":{"type":"string","enum":["powder-coated","plastic-laminate","solid-plastic","phenolic","stainless-steel"],"description":"Return colors for just this material instead of all of them."}}}},{"name":"create_quote","title":"Create a real, hub-priced quote","description":"Create an actual proposal and return a customer portal URL. The hub re-prices the build authoritatively — this is the binding number, unlike price_partition_build. Requires a real name and email because a human proposal record is created and a salesperson may follow up. ALWAYS confirm the configuration and the customer's consent to be contacted before calling this; it is not a read-only lookup.","read_only":false,"endpoint":"https://www.thepartitionpros.com/agent/v1/create_quote","methods":["POST"],"input_schema":{"type":"object","additionalProperties":false,"required":["material","rooms","contact_name","contact_email"],"properties":{"material":{"type":"string","enum":["powder-coated","plastic-laminate","solid-plastic","phenolic","stainless-steel"]},"color":{"type":"string","maxLength":80},"mounting":{"type":"string","maxLength":40,"default":"headrail-braced"},"height":{"type":"string","enum":["standard","full"],"default":"standard"},"rooms":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","additionalProperties":false,"required":["stalls"],"properties":{"layout":{"type":"string","enum":["corner-wall","between-walls","free-standing","alcove","alcove-between-walls"],"description":"Room layout: which walls the stall run touches (it always backs onto a wall). corner-wall = one end of the run butts a side wall; the other end stops short of the wall and is closed with an end panel. between-walls = ONLY when the stalls use the entire length of the wall, wall to wall: the last stall closes against the far side wall, no end panel (stall widths add up to the wall-to-wall dimension). If the row ends short of the far wall (open floor, urinals, sinks or a gap after the last stall), it needs an end panel and is corner-wall, not between-walls, even though a wall exists further along. free-standing = neither end touches a side wall: end panels on both ends. alcove = the stall at the wall end sits in a recess: side wall, back wall AND a wall (or panel) across its front, so its door is on the SIDE of that stall, facing along the row (perpendicular to the other doors); the far end of the run is open with an end panel. Usually the ADA stall. alcove-between-walls = alcove at one end AND the stalls use the entire wall length so the far end closes against a side wall; if the row stops short and needs an end panel, it is alcove. Reading a sketch: toilets are circles/ovals (often with a tank), lines between them are partition panels, a short diagonal or arc at a stall front is a door swing, hatched or shaded rectangles are walls (wet walls, partial walls), not partitions, and a urinal screen is a single short line sticking out from the wall beside a urinal (urinals are small ovals or U shapes on the wall) — count screens in urinal_screens, not stalls. A door drawn on the side of the end stall, or a wall line running from the row front to the room wall in front of that stall, means alcove. Use one room entry per restroom. Changes the price (panel count differs)."},"stalls":{"type":"integer","minimum":1,"maximum":200}}}},"urinal_screens":{"type":"integer","minimum":0,"maximum":500,"default":0},"contact_name":{"type":"string","minLength":1,"maxLength":120},"contact_email":{"type":"string","minLength":5,"maxLength":200},"contact_phone":{"type":"string","maxLength":40},"contact_zip":{"type":"string","maxLength":12},"needed_by":{"type":"string","maxLength":120,"description":"e.g. \"ASAP — ready to order\" or \"Q4 2026\"."},"notes":{"type":"string","maxLength":2000},"request_contact":{"type":"boolean","description":"Whether a salesperson should reach out. Ask the customer first.","default":false}}}}]}