{"openapi":"3.1.0","info":{"title":"Partition Pros Agent API","version":"1.0.0","summary":"Live pricing, catalog, takeoff resolution, and quoting for Division 10 products.","description":"Built for estimators working through an AI assistant. Catalog reads, list pricing, lead times, freight, and build estimates need no authentication.\n\nPricing authority: catalog endpoints return published list prices. `price_partition_build` and `estimate_freight` return storefront ESTIMATES and say so in `pricing_authority`, with a `valid_until`. `create_quote` returns a hub-priced, binding proposal.\n\nRate limit: 120 requests per minute per IP. An MCP server exposing the same tools is at /mcp.","contact":{"name":"Partition Pros","email":"info@thepartitionpros.com","url":"https://www.thepartitionpros.com"}},"servers":[{"url":"https://www.thepartitionpros.com"}],"tags":[{"name":"read","description":"Safe, cacheable, no side effects."},{"name":"write","description":"Creates a record a human will see."}],"paths":{"/agent/v1/search_products":{"post":{"operationId":"search_products","summary":"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.","tags":["read"],"requestBody":{"required":false,"content":{"application/json":{"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."}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}},"get":{"operationId":"search_products_get","summary":"Search the product catalog (query string)","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.\n\nGET accepts only the scalar fields as query parameters; use POST for nested objects and arrays.","tags":["read"],"parameters":[{"name":"query","in":"query","required":false,"description":"Free text, e.g. \"matte black grab bar 36\" or \"recessed towel dispenser\".","schema":{"type":"string","description":"Free text, e.g. \"matte black grab bar 36\" or \"recessed towel dispenser\".","maxLength":200}},{"name":"brand","in":"query","required":false,"description":"Exact manufacturer name to filter by: ASI, Bobrick, Bradley, Hadrian, Zurn, World Dryer.","schema":{"type":"string","description":"Exact manufacturer name to filter by: ASI, Bobrick, Bradley, Hadrian, Zurn, World Dryer.","maxLength":60}},{"name":"category_id","in":"query","required":false,"description":"BigCommerce category id, when narrowing a previous result.","schema":{"type":"integer","description":"BigCommerce category id, when narrowing a previous result."}},{"name":"min_price","in":"query","required":false,"schema":{"type":"number","minimum":0}},{"name":"max_price","in":"query","required":false,"schema":{"type":"number","minimum":0}},{"name":"limit","in":"query","required":false,"description":"Products to return (1–50).","schema":{"type":"integer","description":"Products to return (1–50).","minimum":1,"maximum":50,"default":20}},{"name":"cursor","in":"query","required":false,"description":"next_cursor from a previous response, to page forward.","schema":{"type":"string","description":"next_cursor from a previous response, to page forward."}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}}},"/agent/v1/get_product":{"post":{"operationId":"get_product","summary":"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.","tags":["read"],"requestBody":{"required":true,"content":{"application/json":{"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"]}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}},"get":{"operationId":"get_product_get","summary":"Get one product in full (query string)","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.\n\nGET accepts only the scalar fields as query parameters; use POST for nested objects and arrays.","tags":["read"],"parameters":[{"name":"identifier","in":"query","required":true,"description":"SKU, MPN, model number, or BigCommerce product id.","schema":{"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"]}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}}},"/agent/v1/resolve_takeoff":{"post":{"operationId":"resolve_takeoff","summary":"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.","tags":["read"],"requestBody":{"required":false,"content":{"application/json":{"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}}}}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}},"get":{"operationId":"resolve_takeoff_get","summary":"Price a whole takeoff list (query string)","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.\n\nGET accepts only the scalar fields as query parameters; use POST for nested objects and arrays.","tags":["read"],"parameters":[{"name":"text","in":"query","required":false,"description":"The raw list, one item per line. Either this or `items` is required.","schema":{"type":"string","description":"The raw list, one item per line. Either this or `items` is required.","maxLength":20000}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}}},"/agent/v1/price_partition_build":{"post":{"operationId":"price_partition_build","summary":"Estimate a toilet-partition build","description":"Itemized ESTIMATE for a commercial toilet-partition build: material, stall count, urinal screens, destination state, plus hardware/hinge/height/privacy upcharges. Returns per-line rates and quantities, freight, and a total, from Partition Pros quote history. 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.","tags":["read"],"requestBody":{"required":true,"content":{"application/json":{"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},"hardware":{"type":"string","enum":["chrome","stainless"],"description":"Defaults to chrome."},"height":{"type":"string","enum":["standard","full"],"description":"\"full\" adds +30%."},"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}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}},"get":{"operationId":"price_partition_build_get","summary":"Estimate a toilet-partition build (query string)","description":"Itemized ESTIMATE for a commercial toilet-partition build: material, stall count, urinal screens, destination state, plus hardware/hinge/height/privacy upcharges. Returns per-line rates and quantities, freight, and a total, from Partition Pros quote history. 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.\n\nGET accepts only the scalar fields as query parameters; use POST for nested objects and arrays.","tags":["read"],"parameters":[{"name":"material","in":"query","required":true,"description":"Partition material id.","schema":{"type":"string","enum":["powder-coated","plastic-laminate","solid-plastic","phenolic","stainless-steel"],"description":"Partition material id."}},{"name":"stalls","in":"query","required":true,"description":"Total toilet compartments across the build.","schema":{"type":"integer","description":"Total toilet compartments across the build.","minimum":1,"maximum":500}},{"name":"urinal_screens","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":500,"default":0}},{"name":"state","in":"query","required":true,"description":"Two-letter US state code for freight, e.g. \"TX\".","schema":{"type":"string","description":"Two-letter US state code for freight, e.g. \"TX\".","minLength":2,"maxLength":2}},{"name":"hardware","in":"query","required":false,"description":"Defaults to chrome.","schema":{"type":"string","enum":["chrome","stainless"],"description":"Defaults to chrome."}},{"name":"height","in":"query","required":false,"description":"\"full\" adds +30%.","schema":{"type":"string","enum":["standard","full"],"description":"\"full\" adds +30%."}},{"name":"hinge","in":"query","required":false,"description":"Defaults to gravity.","schema":{"type":"string","enum":["gravity","piano"],"description":"Defaults to gravity."}},{"name":"color","in":"query","required":false,"description":"Color id for the chosen material (see list_options).","schema":{"type":"string","description":"Color id for the chosen material (see list_options).","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}}},"/agent/v1/estimate_freight":{"post":{"operationId":"estimate_freight","summary":"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.","tags":["read"],"requestBody":{"required":true,"content":{"application/json":{"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}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}},"get":{"operationId":"estimate_freight_get","summary":"Estimate LTL freight (query string)","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.\n\nGET accepts only the scalar fields as query parameters; use POST for nested objects and arrays.","tags":["read"],"parameters":[{"name":"state","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":2}},{"name":"material","in":"query","required":true,"schema":{"type":"string","enum":["powder-coated","plastic-laminate","solid-plastic","phenolic","stainless-steel"]}},{"name":"stalls","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":500}},{"name":"urinal_screens","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":500,"default":0}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}}},"/agent/v1/resolve_accessories":{"post":{"operationId":"resolve_accessories","summary":"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.","tags":["read"],"requestBody":{"required":true,"content":{"application/json":{"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}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}},"get":{"operationId":"resolve_accessories_get","summary":"Build a restroom accessory schedule (query string)","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.\n\nGET accepts only the scalar fields as query parameters; use POST for nested objects and arrays.","tags":["read"],"parameters":[{"name":"brand","in":"query","required":false,"description":"Bias SKU selection toward one manufacturer, e.g. \"Bobrick\".","schema":{"type":"string","description":"Bias SKU selection toward one manufacturer, e.g. \"Bobrick\".","maxLength":60}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}}},"/agent/v1/list_options":{"post":{"operationId":"list_options","summary":"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.","tags":["read"],"requestBody":{"required":false,"content":{"application/json":{"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."}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}},"get":{"operationId":"list_options_get","summary":"List every partition option id (query string)","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.\n\nGET accepts only the scalar fields as query parameters; use POST for nested objects and arrays.","tags":["read"],"parameters":[{"name":"material","in":"query","required":false,"description":"Return colors for just this material instead of all of them.","schema":{"type":"string","enum":["powder-coated","plastic-laminate","solid-plastic","phenolic","stainless-steel"],"description":"Return colors for just this material instead of all of them."}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}}},"/agent/v1/create_quote":{"post":{"operationId":"create_quote","summary":"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.","tags":["write"],"requestBody":{"required":true,"content":{"application/json":{"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"]},"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}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input — see error.issues","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"404":{"description":"Not found — see error.alternates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","not_found","rate_limited","upstream_unavailable","not_configured","internal_error"]},"message":{"type":"string"},"hint":{"type":"string","description":"What to do next, written for a model."},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"alternates":{"type":"array","description":"Near-miss suggestions so a caller can retry instead of giving up.","items":{}},"retryable":{"type":"boolean"}},"required":["code","message","retryable"]}},"required":["error"]}}}}}}}}}